İşte Joan ve Marcel'in cevaplarına dayanan yorumum. Yaptığım değişiklikler aşağıdaki gibidir:
- Aksanları kaldırmak için yaygın olarak kabul edilen bir yöntemi kullanın.
- Orta hız iyileştirmeleri için açık Regex önbelleğe alma.
- Daha fazla kelime ayırıcısı tanındı ve kısa çizgilere normalleştirildi.
İşte kod:
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));
}
}
Bu hala Latin olmayan karakter sorununu çözmemektedir. Tamamen alternatif bir çözüm , dizeyi onaltılık gösterimini dönüştürmek için Uri.EscapeDataString kullanmaktır :
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
Ardından bir köprü oluşturmak için verileri kullanın:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Birçok tarayıcı, adres çubuğunda Çince karakterler gösterecek (aşağıya bakınız), ancak benim sınırlı testime göre, tamamen desteklenmiyor.
NOT: Uri.EscapeDataString'in bu şekilde çalışması için , iriParsing etkinleştirilmelidir.
DÜZENLE
C # 'da URL Sümüklü böcekleri oluşturmak isteyenler için, bu ilgili soruyu kontrol etmenizi tavsiye ederim:
Stack Overflow, SEO dostu URL'lerini nasıl oluşturur?
Projem için kullanmaya son verdiğim şey bu.