Вот мое исполнение , на основе ответов Джоан и Марсель. Изменения, которые я сделал, следующие:
- Используйте метод widely accepted для удаления акцентов.
- Явное регулярное кэширование для скромных улучшений скорости.
- Другие разделители слов распознаются и нормализуются к дефисам.
Вот код:
public class UrlSlugger
{
// white space, em-dash, en-dash, underscore
static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);
// characters that are not valid
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
// multiple hyphens
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
// convert to lower case
value = value.ToLowerInvariant();
// remove diacritics (accents)
value = RemoveDiacritics(value);
// ensure all word delimiters are hyphens
value = WordDelimiters.Replace(value, "-");
// strip out invalid characters
value = InvalidChars.Replace(value, "");
// replace multiple hyphens (-) with a single hyphen
value = MultipleHyphens.Replace(value, "-");
// trim hyphens (-) from ends
return value.Trim('-');
}
/// See: http://www.siao2.com/2007/05/14/2629747.aspx
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 = "测试公司";
// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
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>
Многие браузеры отображать китайские символы в адресе bar (см. ниже), но на основании моего ограниченного тестирования он не полностью поддерживается.
ПРИМЕЧАНИЕ: Для того, чтобы Uri.EscapeDataString работать таким образом, iriParsing должен быть включен.
EDIT
Для тех, кто хочет, чтобы генерировать URL Слизняки в C#, я рекомендую проверить этот родственный вопрос:
How does Stack Overflow generate its SEO-friendly URLs?
Это то, что я в конечном итоге, используя для моего проект.
Что значит "slugify"? –
slugify = сделать строку, предоставленную пользователем, безопасной для использования как часть URL ... или базы данных или что-то еще, но обычно это URL. – chakrit