Ось моя передача, заснована на відповідях Джоан та Марселя. Я вніс такі зміни:
- Використовуйте широко прийнятий метод для видалення акцентів.
- Явне кешування регулярних виразів для скромних поліпшень швидкості.
- Більше роздільників слів розпізнано і нормалізовано до дефісів.
Ось код:
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 генерує свої SEO-зручні URL-адреси?
Це те, що я в підсумку використав для свого проекту.