Slugify متن (URL)
استانداردسازی متن برای تبدیل به slug مناسب URL، با پشتیبانی از حروف کوچک، جداکنندهها و حذف کلمات رایج غیرمعنادار.
چرا Slugify نیاز است؟
🔍 بهینهسازی برای موتورهای جستجو
کلمات کلیدی در URL به موتورهای جستجو کمک میکند تا محتوای صفحه را درک کنند و رتبه آن را بهبود بخشند. مثلاً example.com/blog/how-to-learn-javascript نسبت به example.com/blog/123 دوستانهتر است.
👁️ خوانایی و به اشتراکگذاری
کاربران با دیدن URL میتوانند محتوای صفحه را درک کنند، و در به اشتراکگذاری در رسانههای اجتماعی دوستانهتر و آسانتر برای یادآوری و وارد کردن دستی هستند.
💻 سازگاری سیستمی
جلوگیری از خطاهای ناشی از کاراکترهای خاص در نام فایل یا URL، سازگاری بین پلتفرمها (Windows/Linux/Mac) و جلوگیری از مشکلات کدگذاری.
🗄️ دوستانه برای پایگاه داده
به عنوان شناسه منحصر به فرد (مانند نام کاربری یا برچسبها)، از خطر تزریق SQL جلوگیری کنید و برای ایندکسگذاری و جستجو راحتتر باشید.
Slugify چیست؟
Slug عبارتی استانداردسازیشده از متن است که برای استفاده به عنوان URL، نام فایل یا شناسه به کار میرود. پردازش رایج شامل یکسانسازی حروف، حذف علائم نگارشی و اتصال کلمات با جداکنندهها است.
- اولویت ASCII: تا حد امکان علائم تلفظی و نمادها را حذف کنید و فقط حروف و اعداد و فاصله را نگه دارید
- سازگاری با Unicode: پردازش کاراکترهای زبانهای مختلف پس از نرمالسازی NFKD
- دوستانه برای URL: نتیجه تنها شامل حروف، اعداد و جداکنندهها است و مستقیماً قابل استفاده در مسیرها
سوالات متداول
Q: کاراکترهای چینی چگونه پردازش میشوند؟
A: بهطور پیشفرض، علائم تونالی حذف شده و حروف پینیین باقی میمانند. چینی خالص ممکن است به خالی تبدیل شود؛ پیشنهاد میشود ابتدا به صورت دستی به پینیین تبدیل شود و سپس slugify شود، یا از ابزارهای تبدیل پینیین چینی استفاده کنید.
Q: چرا نتیجه من خالی است؟
A: احتمالاً ورودی شما فقط شامل علائم نگارشی/نمادها/فاصلهها است، یا پس از فیلتر کردن کلمات اضافی، کلمهای باقی نمانده است. سعی کنید گزینه فیلتر کلمات اضافی را غیرفعال کنید یا محتوای ورودی خود را تغییر دهید.
Q: از خط تیره (-) یا زیرخط (_) استفاده کنم؟
A: برای SEO، توصیه میشود از خط تیره (-) استفاده شود، چون گوگل آن را به عنوان فاصله تفسیر میکند؛ زیرخط (_) به عنوان یک کاراکتر متصل در نظر گرفته میشود و برای تقسیم کلمات مناسب نیست. برای نام فایل، هر دو قابل قبول هستند.
Q: آیا محدودیتی برای طول slug وجود دارد؟
A: از نظر فنی هیچ محدودیتی وجود ندارد، اما توصیه میشود طول آن کمتر از 50 کاراکتر باشد تا در نمایش URL و بهینهسازی موتورهای جستجو بهتر عمل کند. slugهای بسیار طولانی ممکن است توسط موتورهای جستجو برش داده شوند.
بهترین روشها
روشهای توصیهشده
- ✓ کوتاه نگه دارید (توصیه: کمتر از 50 کاراکتر)
- ✓ از کاراکترهای خاص استفاده نکنید؛ فقط از حروف، اعداد و جداکنندهها استفاده کنید
- ✓ حروف را به حالت کوچک تبدیل کنید تا از مشکلات حساسیت به حروف بزرگ و کوچک جلوگیری شود
- ✓ کلمات اضافی را حذف کنید تا چگالی معنایی افزایش یابد
روشهای پرهیز شونده
- ✗ اطلاعات حساس (مانند شناسه، ایمیل، رمز عبور) را شامل نشود
- ✗ از کاراکترهای خاص (مانند @#$%^&*) استفاده نکنید
- ✗ فاصلهها یا جداکنندههای متوالی را حذف کنید
- ✗ از تکرار کلمات یکسان خودداری کنید
توضیحات فنی
از تجزیه NFKD + حذف علائم ترکیبی (\p{M}) استفاده میشود تا Café به Cafe تبدیل شود. این روش اکثر کاراکترهای زبانهای لاتین را پشتیبانی میکند.
مبتنی بر کلمات رایج انگلیسی (a/an/the/and/or/of/to/in/on/for/at/by/with)، قابل گسترش و سفارشیسازی. کلمات اضافی چینی نیاز به پردازش جداگانه دارند.
نیازمند پشتیبانی از ES6+ و عبارات منظم Unicode (\p{...}) است. تمام مرورگرهای مدرن (Chrome 64+، Firefox 78+، Safari 11.1+) این قابلیت را پشتیبانی میکنند.
چگونه میتوان با زبانهای برنامهنویسی Slug تولید کرد؟
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("^-+|-+$", "");
}