Hier ist meine Wiedergabe basierend auf Joans und Marcel's Antworten. Die vorgenommenen Änderungen lauten wie folgt:
- Verwenden Sie eine widely accepted Methode, um Akzente zu entfernen.
- Explizite Regex-Caching für bescheidene Geschwindigkeit Verbesserungen.
- Weitere Worttrennzeichen erkannt und normalisiert auf Bindestriche. Hier
ist der Code:
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));
}
}
Dieses noch löst nicht das nicht-lateinischen Zeichen Problem. Eine völlig andere Lösung wäre Uri.EscapeDataString zu verwenden, um die die Zeichenfolge seiner hexadezimale Darstellung zu konvertieren:
string original = "测试公司";
// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
string converted = Uri.EscapeDataString(original);
dann die Daten verwenden, um einen Hyperlink zu erstellen:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Viele Browser werden in der Adresse chinesische Schriftzeichen angezeigt werden Bar (siehe unten), aber basierend auf meinen begrenzten Tests wird es nicht vollständig unterstützt.
HINWEIS: Damit Uri.EscapeDataString diese Weise arbeiten, iriParsing muss aktiviert sein.
EDIT
Für diejenigen, die URL Slugs in C# zu erzeugen, empfehle ich dieses Kontroll damit verbundene Frage nach:
How does Stack Overflow generate its SEO-friendly URLs?
Es ist das, was ich für die Verwendung am Ende meiner Projekt.
Was bedeutet es, zu "slugify"? –
slugify = die vom Benutzer übergebene Zeichenfolge als Teil einer URL ... oder Datenbank oder was auch immer, aber normalerweise die URL sicher verwenden. – chakrit