Slugify Teks (URL)
Normalisasi teks menjadi slug yang mesra URL, menyokong huruf kecil, pemisah, dan penyingkiran kata henti tersuai.
Mengapa perlu Slugify?
🔍 Optimisasi SEO
Kata kunci dalam URL membantu enjin carian memahami kandungan laman, meningkatkan peringkat. Contohnya, example.com/blog/how-to-learn-javascript lebih mesra daripada example.com/blog/123.
👁️ Keterbacaan & Kongsi
Pengguna boleh mengetahui kandungan hanya daripada URL, lebih mesra untuk berkongsi di media sosial, dan lebih mudah diingat serta dimasukkan secara manual.
💻 Kompatibiliti Sistem
Elakkan ralat akibat aksara khas dalam nama fail/URL, kompatibel lintas platform (Windows/Linux/Mac), elakkan masalah pengkodan.
🗄️ Mesra Pangkalan Data
Sebagai pengenal unik (seperti nama pengguna, label), elakkan risiko SQL injection, memudahkan pengindeksan dan carian.
Apakah itu Slugify?
Slug adalah frasa yang distandardkan daripada teks untuk digunakan sebagai URL, nama fail, atau pengenal. Proses biasa termasuk penyamaan besar-kecil huruf, penghapusan tanda baca, dan penyambungan perkataan dengan pemisah.
- Prioriti ASCII: Sebanyak mungkin hapus aksen dan simbol, hanya tinggalkan huruf, nombor, dan ruang
- Kompatibel Unicode: Normalisasi NFKD untuk sebahagian besar aksara bahasa sebelum diproses
- Mesra URL: Hasil hanya mengandungi huruf, nombor, dan pemisah, boleh digunakan terus dalam laluan
Soalan Lazim
Q: Karakter Cina akan diproses bagaimana?
A: Secara lalai, tanda diakritik akan dihapus dan hanya huruf pinyin yang disimpan. Cina tulen mungkin menjadi kosong; disarankan untuk mentransliterate ke pinyin secara manual sebelum slugify, atau gunakan alat transliterasi pinyin Cina.
Q: Mengapa hasil saya kosong?
A: Mungkin input anda hanya terdiri dari tanda baca/simbol/ruang, atau semua perkataan telah dihapus selepas penapisan perkataan henti. Cuba matikan pilihan perkataan henti atau ubah kandungan input anda.
Q: Pemisah sepatutnya menggunakan - atau _?
A: SEO disarankan menggunakan - (tanda hubung), kerana Google menganggapnya sebagai ruang; _ (garis bawah) dianggap sebagai penghubung dan kurang sesuai untuk pemisahan kata. Untuk nama fail, anda boleh memilih mana-mana.
Q: Adakah terdapat had panjang untuk slug?
A: Secara teknikal tiada had, tetapi disarankan untuk mengekalkan di bawah 50 aksara untuk memudahkan paparan URL dan SEO. Slug yang terlalu panjang mungkin dipotong oleh enjin carian.
Amalan Terbaik
Amalan Disarankan
- ✓ Kekalkan ringkas (disarankan < 50 aksara)
- ✓ Elakkan karakter istimewa; gunakan hanya huruf/angka/pemisah
- ✓ Gunakan huruf kecil untuk mengelakkan isu sensitiviti huruf besar-kecil
- ✓ Buang perkataan henti untuk meningkatkan kepadatan makna
Amalan Dihindari
- ✗ Jangan sertakan maklumat sensitif (seperti ID, emel, kata laluan)
- ✗ Jangan gunakan karakter istimewa (seperti @#$%^&*)
- ✗ Jangan kekalkan ruang atau pemisah berterusan
- ✗ Jangan gunakan perkataan yang sama secara berulang
Keterangan Teknikal
Menggunakan NFKD分解 + menghapus tanda diakritik kombinasi (\p{M}), mengubah Café menjadi Cafe. Menyokong kebanyakan aksara Latin.
Berdasarkan perkataan biasa dalam bahasa Inggeris (a/an/the/and/or/of/to/in/on/for/at/by/with), boleh diperluaskan secara tersuai. Perkataan henti Cina memerlukan pemprosesan tambahan.
Memerlukan penyokongan ES6+ dan ungkapan regular Unicode (\p{...}). Pelayar moden (Chrome 64+, Firefox 78+, Safari 11.1+) semuanya menyokong.
Bagaimana untuk menghasilkan Slug melalui bahasa pengaturan?
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("^-+|-+$", "");
}