منشئ الـ Slug
حوّل أي نص إلى slug نظيف وملائم لعناوين URL
نص الإدخال
Slug
ما هو الـ URL Slug؟
الـ URL slug هو الجزء من عنوان الويب الذي يُعرّف صفحةً محددة بصيغة مقروءة للإنسان. في العنوان https://example.com/blog/my-first-post، الـ slug هو my-first-post. يُحوّل منشئ الـ slug عنوان الصفحة أو وصفها إلى سلسلة نصية تحتوي فقط على أحرف صغيرة وأرقام وشرطات (أو فاصل آخر مختار). تُزيل هذه العملية المسافات وتُزيل التشكيل اللاتيني وتحذف الأحرف الخاصة وتُوحّد المسافات البيضاء في فاصل واحد.
توليد الـ slug خطوة معيارية في أنظمة إدارة المحتوى ومولّدات المواقع الساكنة ومنصات التدوين وأي تطبيق يستخرج عناوين URL من مدخلات المستخدم. تتضمن WordPress وGhost وHugo وNext.js وDjango منطق توليد الـ slug لأن عناوين URL القابلة للقراءة تُحسّن قابلية الاستخدام والسيو معًا. الـ slug المُنسَّق جيدًا يُخبر المستخدم بمحتوى الصفحة قبل أن ينقر على الرابط.
جاء مصطلح "slug" من عالم النشر الصحفي، حيث كان يشير إلى تسمية مختصرة تُستخدم لتعريف مقالة ما أثناء الإنتاج. في تطوير الويب، يؤدي الـ slug الوظيفة ذاتها: إنه معرّف مضغوط وفريد وآمن لعناوين URL، مستخرج من عنوان أو اسم أطول. ولأن الـ slugs تُستخرج برمجيًا، يضمن منشئ الـ slug الموثوق الاتساق عبر كل الصفحات والمناطق الجغرافية.
لماذا تستخدم منشئ الـ Slug هذا؟
إنشاء slugs لعناوين URL يدويًا عُرضة للأخطاء. نسيان إزالة حرف ذي علامة لهجية، أو ترك شرطة مزدوجة، أو إغفال حالة حافة في مدخلات Unicode يمكن أن ينتج عناوين URL معطوبة أو قبيحة. تُعالج هذه الأداة تلك المشكلات تلقائيًا.
حالات استخدام منشئ الـ Slug
قواعد توليد الـ Slug ومعالجة الأحرف
يتبع توليد الـ slug تسلسلًا متوقعًا من التحويلات. فهم كل خطوة يساعدك في تصحيح الإخراج غير المتوقع أو بناء دالة slugify الخاصة بك.
- 1. تطبيع Unicode (NFD)تحليل الأحرف المدمجة إلى حرف أساسي + علامة دمج. على سبيل المثال، é (U+00E9) يُصبح e + accent مدمج (U+0301). هذا يجعل إزالة التشكيل ممكنة في الخطوة التالية.
- 2. إزالة التشكيلإزالة جميع الأحرف في كتلة علامات Unicode للتشكيل المدمجة (U+0300–U+036F). بعد هذه الخطوة، يُصبح café كـcafe ويُصبح Ñ كـN.
- 3. إزالة الأحرف الخاصةاستبدال أي حرف ليس حرفًا أو رقمًا أو مسافة بيضاء أو شرطة بمسافة. هذا يحذف علامات الترقيم والرموز والأحرف التي لا تُكافئها في ASCII.
- 4. قص المسافات البيضاء وضغطهاإزالة المسافات البيضاء الأولى والأخيرة، ثم ضغط جميع تسلسلات المسافات أو الشرطات السفلية أو الشرطات المتتالية في فاصل واحد مختار.
- 5. تطبيق حالة الأحرف والفاصلالتحويل إلى أحرف صغيرة (اختياري) وضم الكلمات بحرف الفاصل المختار: شرطة (-) أو شرطة سفلية (_) أو نقطة (.).
مرجع تحويل الأحرف
يوضح الجدول أدناه كيفية معالجة الأحرف الشائعة أثناء توليد الـ slug:
| المدخل | المخرج | القاعدة المطبَّقة |
|---|---|---|
| Hello World | hello-world | Lowercase + space → hyphen |
| Café au Lait | cafe-au-lait | NFD normalization strips é → e |
| naïve résumé | naive-resume | Multiple diacritics removed |
| Price: $9.99! | price-9-99 | Symbols ($, !, :) removed |
| too many | too-many | Whitespace trimmed and collapsed |
| one--two___three | one-two-three | Mixed separators collapsed |
| Привет мир | privet-mir | Cyrillic (if transliteration) or removed |
| file_name.txt | file-name-txt | Dots and underscores replaced |
| React & Vue | react-vue | Ampersand removed |
| 2026-03-30 | 2026-03-30 | Digits and hyphens preserved |
أمثلة الكود
توليد الـ slug في اللغات وأطر العمل الشائعة. كل مثال يُعالج تطبيع Unicode وإزالة التشكيل وإدراج الفاصل.
function slugify(text, separator = '-') {
return text
.normalize('NFD') // decompose accented chars
.replace(/[\u0300-\u036f]/g, '') // strip diacritics
.toLowerCase()
.replace(/[^\w\s-]/g, ' ') // drop special chars
.trim()
.replace(/[\s_-]+/g, separator) // collapse whitespace → separator
// slugify('Café au Lait') → "cafe-au-lait"
// slugify('Hello World', '_') → "hello_world"
}
// Node.js alternative using the `slugify` npm package:
// npm install slugify
// const slugify = require('slugify')
// slugify('Hello World', { lower: true, strict: true }) → "hello-world"import re
import unicodedata
def slugify(text: str, separator: str = '-') -> str:
"""Convert text to a URL-safe slug."""
text = unicodedata.normalize('NFD', text)
text = text.encode('ascii', 'ignore').decode('ascii') # strip non-ASCII
text = text.lower()
text = re.sub(r'[^\w\s-]', ' ', text)
text = text.strip()
text = re.sub(r'[\s_-]+', separator, text)
return text
# slugify('Café au Lait') → "cafe-au-lait"
# slugify('Hello World', '_') → "hello_world"
# Alternative: python-slugify (pip install python-slugify)
# from slugify import slugify
# slugify('Café au Lait') → "cafe-au-lait"package main
import (
"regexp"
"strings"
"unicode"
"golang.org/x/text/unicode/norm"
"golang.org/x/text/transform"
"golang.org/x/text/runes"
)
func slugify(text string) string {
// NFD normalize and strip diacritics
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
result, _, _ := transform.String(t, text)
result = strings.ToLower(result)
re := regexp.MustCompile(`[^\w\s-]+`)
result = re.ReplaceAllString(result, " ")
result = strings.TrimSpace(result)
re = regexp.MustCompile(`[\s_-]+`)
result = re.ReplaceAllString(result, "-")
return result
}
// slugify("Café au Lait") → "cafe-au-lait"
// slugify("Hello World") → "hello-world"function slugify(string $text, string $separator = '-'): string {
// Transliterate non-ASCII characters
$text = transliterator_transliterate(
'Any-Latin; Latin-ASCII; Lower()', $text
);
// Remove anything that is not a word char, space, or hyphen
$text = preg_replace('/[^\w\s-]/', ' ', $text);
$text = trim($text);
$text = preg_replace('/[\s_-]+/', $separator, $text);
return $text;
}
// slugify('Café au Lait') → "cafe-au-lait"
// slugify('Hello World', '_') → "hello_world"