นี่คือความหมายของฉันตามคำตอบของ Joan และ Marcel การเปลี่ยนแปลงที่ฉันทำมีดังนี้:
- ใช้ วิธีที่ได้รับการยอมรับอย่างกว้างขวางเพื่อลบสำเนียง
- การแคช Regex อย่างชัดเจนสำหรับการปรับปรุงความเร็วเล็กน้อย
- ตัวคั่นคำอื่น ๆ ได้รับการยอมรับและทำให้เป็นเครื่องหมายขีดกลาง
นี่คือรหัส:
public class UrlSlugger
{
static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
value = value.ToLowerInvariant();
value = RemoveDiacritics(value);
value = WordDelimiters.Replace(value, "-");
value = InvalidChars.Replace(value, "");
value = MultipleHyphens.Replace(value, "-");
return value.Trim('-');
}
private static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
}
สิ่งนี้ยังไม่สามารถแก้ปัญหาอักขระที่ไม่ใช่ภาษาละตินได้ อีกทางเลือกหนึ่งคือการใช้Uri.EscapeDataStringเพื่อแปลงสตริงเป็นตัวแทนฐานสิบหก
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
จากนั้นใช้ข้อมูลเพื่อสร้างไฮเปอร์ลิงก์:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
เบราว์เซอร์จำนวนมากจะแสดงอักษรจีนในแถบที่อยู่ (ดูด้านล่าง) แต่จากการทดสอบที่ จำกัด ของฉันมันไม่ได้รับการสนับสนุนอย่างสมบูรณ์
หมายเหตุ: เพื่อให้Uri.EscapeDataStringทำงานในลักษณะนี้ต้องเปิดใช้งานiriParsing
แก้ไข
สำหรับผู้ที่ต้องการสร้าง URL Slugs ใน C # ขอแนะนำให้ตรวจสอบคำถามที่เกี่ยวข้องนี้:
Stack Overflow สร้าง URL ที่เป็นมิตรกับ SEO ได้อย่างไร
มันคือสิ่งที่ฉันใช้สำหรับโครงการของฉัน