تحويل النص إلى Slug (URL)
تنظيم النص إلى slug صديق للـ URL، مع دعم التحويل إلى حروف صغيرة، فواصل مخصصة، وإزالة الكلمات الشائعة.
لماذا تحتاج إلى Slugify؟
🔍 تحسين محركات البحث (SEO)
الكلمات المفتاحية في الـ URL تساعد محركات البحث على فهم محتوى الصفحة وتحسين ترتيبها. على سبيل المثال، example.com/blog/how-to-learn-javascript أكثر صداقة من example.com/blog/123.
👁️ القابلية للقراءة والمشاركة
يمكن للمستخدمين معرفة محتوى الصفحة من خلال الـ URL مباشرة، مما يجعله أكثر صداقة عند المشاركة على وسائل التواصل الاجتماعي، وأسهل في التذكر والإدخال اليدوي.
💻 التوافق مع الأنظمة
تجنب الأخطاء الناتجة عن الرموز الخاصة في أسماء الملفات أو الـ URLs، مع التوافق عبر المنصات (Windows/Linux/Mac)، وتجنب مشكلات الترميز.
🗄️ صديق لقواعد البيانات
استخدامه كمُعرّف فريد (مثل أسماء المستخدمين أو الوسوم) يقلل من خطر حقن SQL، ويسهل الفهرسة والاستعلام.
ما هو Slugify؟
الـ Slug هو سلسلة قصيرة من النص المُنظّم المستخدمة كـ URL أو اسم ملف أو مُعرّف. تشمل المعالجة الشائعة توحيد الحالة، إزالة علامات الترقيم، وربط الكلمات بفواصل.
- أولوية ASCII: إزالة الحركات والرموز قدر الإمكان، والاحتفاظ فقط بالأحرف والأرقام والمسافات
- توافق Unicode: معالجة معظم أحرف اللغات عبر التوحيد NFKD
- صديق للـ URL: النتيجة تحتوي فقط على أحرف وأرقام والفواصل، ويمكن استخدامها مباشرة في المسارات
الأسئلة الشائعة
س: كيف يتم معالجة الأحرف الصينية؟
ج: يتم حذف علامات التشكيل افتراضيًا مع الاحتفاظ بحروف البينيين. قد تصبح النصوص الصينية البحتة فارغة، يُوصى بتحويلها يدويًا إلى البينيين قبل تحويلها إلى slug، أو استخدام أداة تحويل صينية إلى بيين.
س: لماذا تكون النتيجة فارغة؟
ج: قد يكون المدخل كله عبارة عن علامات ترقيم/رموز/مسافات، أو تم حذف جميع الكلمات بعد تفعيل تصفية الكلمات التوقفية. جرّب تعطيل خيار الكلمات التوقفية أو تعديل المحتوى المُدخل.
س: ما هو الفاصل الأنسب، - أم _؟
ج: يُوصى باستخدام - (الخط الفاصل) من أجل تحسين محركات البحث، حيث تُعامله جوجل كمسافات؛ بينما تُعامل _ (الشرططة السفلية) كرابط، مما يعيق تقسيم الكلمات. يمكن اختيار أي منهما لاسم الملف.
س: هل هناك حد لطول الـ Slug؟
ج: لا توجد قيود تقنية، لكن يُوصى بالحفاظ على طوله أقل من 50 حرفًا لتسهيل عرض الرابط وتحسين محركات البحث. قد تُقطّع الـ Slugs الطويلة من قبل محركات البحث.
أفضل الممارسات
الممارسات الموصى بها
- ✓ الإبقاء على الـ Slug قصيرًا (يفضل أن يكون أقل من 50 حرفًا)
- ✓ تجنب استخدام الأحرف الخاصة، واستخدم الأحرف والأرقام والفاصل فقط
- ✓ استخدام الأحرف الصغيرة لتجنب مشاكل الحساسية للحالة
- ✓ إزالة الكلمات التوقفية لتحسين كثافة المعنى
الممارسات التي يجب تجنبها
- ✗ لا تضُم معلومات حساسة (مثل المعرفات أو البريد الإلكتروني أو كلمات المرور)
- ✗ لا تستخدم الأحرف الخاصة (مثل @#$%^&*)
- ✗ لا تحتفظ بالمسافات أو الفواصل المتكررة
- ✗ لا تكرر نفس الكلمة
ملاحظات تقنية
يتم استخدام NFKD للتفكيك + حذف علامات التشكيل (\p{M})، مثل تحويل Café إلى Cafe. يدعم معظم أحرف لاتينية.
مبنية على الكلمات الشائعة بالإنجليزية (a/an/the/and/or/of/to/in/on/for/at/by/with)، ويمكن توسيعها حسب الرغبة. تتطلب الكلمات التوقفية الصينية معالجة إضافية.
يتطلب دعم ES6+ وتعبيرات RegExp 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("^-+|-+$", "");
}