سؤال

كيف يمكنني إنشاء عنوان URL مألوف في لغة C#؟أقوم حاليًا باستبدال المسافات بشرطة سفلية، ولكن كيف يمكنني إنشاء عناوين URL مثل Stack Overflow؟

على سبيل المثال كيف يمكنني التحويل:

كيف أقوم بإنشاء عنوان URL مألوف في C#؟

داخل

كيف أقوم بإنشاء عنوان URL صديق في C

هل كانت مفيدة؟

المحلول

هناك العديد من الأشياء التي يمكن تحسينها في حل جيف.

if (String.IsNullOrEmpty(title)) return "";

IMHO، وليس المكان المناسب لاختبار هذا.إذا تم تمرير سلسلة فارغة للدالة، فقد حدث خطأ خطير على أي حال.قم بإلقاء خطأ أو لا تتفاعل على الإطلاق.

// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one

العمل مرتين.مع الأخذ في الاعتبار أن كل عملية تنشئ سلسلة جديدة تمامًا، فهذا أمر سيئ، حتى لو لم يكن الأداء يمثل مشكلة.

// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");

مرة أخرى، في الأساس ضعف العمل:أولاً، استخدم regex لاستبدال مسافات متعددة مرة واحدة.ثم استخدم التعبير العادي مرة أخرى لاستبدال شرطات متعددة مرة واحدة.تعبيران للتحليل، وآلتان يتم إنشاؤهما في الذاكرة، وتكرارهما مرتين عبر السلسلة، وإنشاء سلسلتين:يمكن دمج كل هذه العمليات في عملية واحدة.

من أعلى رأسي، دون أي اختبار على الإطلاق، سيكون هذا حلاً مكافئًا:

// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;

لاحظ أن هذه الطريقة تستخدم وظائف السلسلة بدلاً من وظائف regex ووظائف char بدلاً من وظائف السلسلة كلما أمكن ذلك.

نصائح أخرى

وإليك كيف نفعل ذلك.لاحظ أنه من المحتمل أن تكون هناك شروط حافة أكثر مما تدرك للوهلة الأولى.

if (String.IsNullOrEmpty(title)) return "";

// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", "");
// remove any leading or trailing spaces left over
title = title.Trim();
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");
// make it all lower case
title = title.ToLower();
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dash, if there is one
if (title.EndsWith("-"))
    title = title.Substring(0, title.Length - 1);
return title;

هذا جزء من الطريق إلى هناك (باستخدام القائمة البيضاء للأحرف الصالحة):

new Regex("[^a-zA-Z-_]").Replace(s, "-")

ومع ذلك، فإنه يوفر لك سلسلة تنتهي بـ "--".لذلك ربما يكون هناك تعبير عادي ثانٍ لقص تلك الكلمات من بداية/نهاية السلسلة، وربما استبدال أي "--" داخلي بـ "-".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top