Voici mon interprétation , basé sur les réponses de Joan et Marcel. Les modifications que j'ai apportées sont les suivantes:
- Utilisez une méthode pour supprimer les accents.
- Mise en cache explicite Regex pour des améliorations de vitesse modestes.
- Plus de séparateurs de mots reconnus et normalisés aux traits d'union.
Voici le 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));
}
}
Cela ne résout pas le problème de caractères non latins. Une solution complètement alternative serait d'utiliser Uri.EscapeDataString pour convertir la la chaîne de sa représentation hexagonale:
string original = "测试公司";
// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
string converted = Uri.EscapeDataString(original);
Utilisez ensuite les données pour générer un lien hypertexte:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
De nombreux navigateurs afficheront les caractères chinois dans l'adresse barre (voir ci-dessous), mais basé sur mes tests limités, il n'est pas complètement pris en charge.
REMARQUE: Pour Uri.EscapeDataString fonctionner de cette façon, iriParsing doit être activé.
EDIT
Pour ceux qui cherchent à générer des URL Limaces en C#, je vous recommandons de vérifier cette question connexe:
How does Stack Overflow generate its SEO-friendly URLs?
Il est ce que je fini par utiliser pour mon projet.
Qu'est-ce que cela signifie pour "slugify"? –
slugify = rendre une chaîne soumise par l'utilisateur en toute sécurité pour une utilisation dans le cadre d'une URL ... ou d'une base de données ou autre chose, mais généralement l'URL. – chakrit