Slugify Teks (URL)

Normalisasi teks menjadi slug yang ramah URL, mendukung huruf kecil, pemisah, dan penghapusan kata stop khusus.

Parameter & Input

Disarankan menggunakan - atau _, panjang 1~3 karakter

Hasil

Mengapa Perlu Slugify?

🔍 Optimasi SEO

Kata kunci dalam URL membantu mesin pencari memahami konten halaman, meningkatkan peringkat. Misalnya, example.com/blog/how-to-learn-javascript lebih ramah daripada example.com/blog/123.

👁️ Keterbacaan & Berbagi

Pengguna dapat langsung memahami isi halaman dari URL, membuatnya lebih ramah saat dibagikan di media sosial, mudah diingat, dan mudah dimasukkan secara manual.

💻 Kompatibilitas Sistem

Hindari kesalahan akibat karakter khusus dalam nama file/URL, kompatibel lintas platform (Windows/Linux/Mac), hindari masalah encoding.

🗄️ Ramah Database

Sebagai identifikasi unik (misalnya username, tag), hindari risiko SQL injection, memudahkan pengindeksan dan pencarian.

Apa itu Slugify?

Slug adalah frasa yang dinormalisasi dari teks yang digunakan sebagai URL, nama file, atau identifikasi. Proses umum meliputi penyeragaman huruf, penghapusan tanda baca, dan penyambungan kata dengan pemisah.

  • Prioritas ASCII: Hapus aksen dan simbol sebanyak mungkin, hanya pertahankan huruf, angka, dan spasi
  • Kompatibel Unicode: Normalisasi NFKD untuk sebagian besar karakter bahasa sebelum diproses
  • Ramah URL: Hasil hanya berisi huruf, angka, dan pemisah, siap digunakan langsung di path

Skenario Penggunaan

URL Artikel Blog

Cara Belajar JavaScript?

how-to-learn-javascript

Penamaan File

Dokumen Persyaratan Produk v2.0.docx

product-requirements-v2-0.docx

Identifier Database

Pengguna-Zhang San

user-zhang-san

Pertanyaan Umum

Q: Bagaimana karakter Cina ditangani?

A: Secara default, tanda aksen dihapus dan hanya huruf pinyin yang dipertahankan. Cina murni mungkin menjadi kosong; disarankan untuk mengonversi ke pinyin secara manual sebelum slugify, atau gunakan alat konversi pinyin Cina.

Q: Mengapa hasil saya kosong?

A: Mungkin input Anda hanya terdiri dari tanda baca/simbol/spasi, atau semua kata tersisa dihapus setelah filter stopword. Coba nonaktifkan opsi stopword atau sesuaikan konten input Anda.

Q: Sebaiknya menggunakan - atau _ sebagai pemisah?

A: Untuk SEO, disarankan menggunakan - (tanda hubung), karena Google menganggapnya sebagai spasi; _ (garis bawah) dianggap sebagai penghubung, yang kurang baik untuk pemisahan kata. Untuk nama file, keduanya boleh dipilih.

Q: Apakah ada batasan panjang slug?

A: Secara teknis tidak ada batasan, tetapi disarankan agar tetap di bawah 50 karakter agar lebih mudah ditampilkan di URL dan ramah SEO. Slug terlalu panjang berpotensi dipotong oleh mesin pencari.

Praktik Terbaik

Praktik yang Direkomendasikan

  • Pertahankan singkat (disarankan < 50 karakter)
  • Hindari karakter khusus; gunakan hanya huruf, angka, dan pemisah
  • Gunakan huruf kecil untuk menghindari masalah sensitivitas huruf
  • Hapus kata stop agar densitas semantik lebih tinggi

Praktik yang Harus Dihindari

  • Jangan sertakan informasi sensitif (seperti ID, email, kata sandi)
  • Jangan gunakan karakter khusus (seperti @#$%^&*)
  • Jangan pertahankan spasi atau pemisah berurutan
  • Jangan gunakan kata yang sama berulang-ulang

Penjelasan Teknis

Normalisasi Unicode:

Menggunakan dekomposisi NFKD + penghapusan tanda aksen gabungan (\p{M}), mengubah Café menjadi Cafe. Mendukung sebagian besar karakter Latin.

Daftar Kata Stop:

Berdasarkan kata umum bahasa Inggris (a/an/the/and/or/of/to/in/on/for/at/by/with), dapat diperluas secara kustom. Kata stop bahasa Cina memerlukan penanganan tambahan.

Kompatibilitas Browser:

Memerlukan dukungan ES6+ dan ekspresi reguler Unicode (\p{...}). Browser modern (Chrome 64+, Firefox 78+, Safari 11.1+) sudah mendukung.

Bagaimana cara menghasilkan Slug melalui bahasa pemrograman?

JavaScript

function slugify(text) {
  return text
    .toLowerCase()
    .normalize("NFKD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/[^\w\s-]/g, "")
    .trim()
    .replace(/[\s_-]+/g, "-")
    .replace(/^-+|-+$/g, "");
}

PHP

function slugify($text) {
  $text = mb_strtolower($text);
  $text = iconv("UTF-8", "ASCII//TRANSLIT", $text);
  $text = preg_replace("/[^\w\s-]/", "", $text);
  $text = preg_replace("/[\s_-]+/", "-", $text);
  return trim($text, "-");
}

Python

import re
import unicodedata

def slugify(text):
    text = text.lower()
    text = unicodedata.normalize("NFKD", text)
    text = text.encode("ascii", "ignore").decode("ascii")
    text = re.sub(r"[^\w\s-]", "", text)
    text = re.sub(r"[\s_-]+", "-", text)
    return text.strip("-")

Go

import (
    "regexp"
    "strings"
    "golang.org/x/text/unicode/norm"
)

func Slugify(text string) string {
    text = strings.ToLower(text)
    text = norm.NFKD.String(text)
    re := regexp.MustCompile(`[^\w\s-]`)
    text = re.ReplaceAllString(text, "")
    re = regexp.MustCompile(`[\s_-]+`)
    text = re.ReplaceAllString(text, "-")
    return strings.Trim(text, "-")
}

Ruby

require "unicode"

def slugify(text)
  text = text.downcase
  text = Unicode.nfkd(text).gsub(/[^\x00-\x7F]/, "")
  text = text.gsub(/[^\w\s-]/, "")
  text = text.gsub(/[\s_-]+/, "-")
  text.strip.gsub(/^-+|-+$/, "")
end

Java

import java.text.Normalizer;

public static String slugify(String text) {
    text = text.toLowerCase();
    text = Normalizer.normalize(text, Normalizer.Form.NFKD);
    text = text.replaceAll("[^\\w\\s-]", "");
    text = text.replaceAll("[\\s_-]+", "-");
    return text.replaceAll("^-+|-+$", "");
}