2009-08-27 8 views
2

Quelle est la meilleure façon de nettoyer une URL? Je cherche une URL comme celui-ciQuelle est la meilleure façon de nettoyer une URL avec un titre

what_is_the_best_headache_medication

Mon code actuel

public string CleanURL(string str) 
{ 
    str = str.Replace("!", ""); 
    str = str.Replace("@", ""); 
    str = str.Replace("#", ""); 
    str = str.Replace("$", ""); 
    str = str.Replace("%", ""); 
    str = str.Replace("^", ""); 
    str = str.Replace("&", ""); 
    str = str.Replace("*", ""); 
    str = str.Replace("(", ""); 
    str = str.Replace(")", ""); 
    str = str.Replace("-", ""); 
    str = str.Replace("_", ""); 
    str = str.Replace("+", ""); 
    str = str.Replace("=", ""); 
    str = str.Replace("{", ""); 
    str = str.Replace("[", ""); 
    str = str.Replace("]", ""); 
    str = str.Replace("}", ""); 
    str = str.Replace("|", ""); 
    str = str.Replace(@"\", ""); 
    str = str.Replace(":", ""); 
    str = str.Replace(";", ""); 
    str = str.Replace(@"\", ""); 
    str = str.Replace("'", ""); 
    str = str.Replace("<", ""); 
    str = str.Replace(">", ""); 
    str = str.Replace(",", ""); 
    str = str.Replace(".", ""); 
    str = str.Replace("`", ""); 
    str = str.Replace("~", ""); 
    str = str.Replace("/", ""); 
    str = str.Replace("?", ""); 
    str = str.Replace(" ", " "); 
    str = str.Replace(" ", " "); 
    str = str.Replace(" ", " "); 
    str = str.Replace("  ", " "); 
    str = str.Replace("  ", " "); 
    str = str.Replace("  ", " "); 
    str = str.Replace("  ", " "); 
    str = str.Replace("   ", " "); 
    str = str.Replace("   ", " "); 
    str = str.Replace("   ", " "); 
    str = str.Replace("   ", " "); 
    str = str.Replace("    ", " "); 
    str = str.Replace("    ", " "); 
    str = str.Replace(" ", "_"); 
    return str; 
} 
+5

Ce code aurait l'air bien au Daily WTF ... ;-) –

+0

haha..lol..Je sais que je sais que je dois étudier regex – user161433

+1

Regex n'est pas nécessaire pour cela. Linq ferait un meilleur travail. filter = "nonallowedchars" .Aggregate (non filtré, (u, n) => u.Remplacer (n, '')); – Dykam

Répondre

0
  1. Comment définissez-vous "friendly" URL - Je suppose que vous souhaitez retirer _ de
  2. etc.
  3. Je regarderais dans une expression régulière ici.

Si vous voulez persister avec la méthode ci-dessus, je suggère de passer à StringBuilder sur une chaîne. C'est parce que chacune de vos opérations de remplacement crée une nouvelle chaîne.

2

Vous devriez envisager d'utiliser une expression régulière à la place. C'est beaucoup plus efficace que ce que vous essayez de faire ci-dessus.

Plus d'informations sur les expressions régulières here.

0

je peux serrer une seule pièce de ce:

while (str.IndexOf(" ") > 0) 
    str = str.Replace(" ", " "); 

... au lieu de votre nombre infini de " " remplacements. Mais vous voulez presque certainement une expression régulière à la place.

3

expressions régulières pour vous:

public string CleanURL(string str) 
{ 
    str = Regex.Replace(str, "[^a-zA-Z0-9 ]", ""); 
    str = Regex.Replace(str, " +", "_"); 
    return str; 
} 

(Pas vraiment testé, du haut de ma tête.)

Permettez-moi de vous expliquer:

La première ligne supprime tout ce qui est pas alphanumérique caractère (majuscule ou minuscule) ou un espace. La deuxième ligne remplace toute séquence d'espaces (1 ou plus, séquentiellement) avec un seul trait de soulignement.

+0

Votre première regex mange les espaces. –

+0

Correction, merci :) –

+0

Cool. Cela ressemble à ce que j'ai, sauf que je préfère remplacer les espaces par des traits d'union plutôt que par des traits de soulignement. Pour le référencement je pense qu'il n'y a pas de différence. –

0

Ou, un peu plus bavard, mais cela ne permet alphanumérique et des espaces (qui sont remplacés par « - »)

string Cleaned = String.Empty; 
foreach (char c in Dirty) 
    if (((c >= 'a') && (c <= 'z')) || 
     (c >= 'A') && (c <= 'Z') || 
     (c >= '0') && (c <= '9') || 
     (c == ' ')) 
      Cleaned += c; 
Cleaned = Cleaned.Replace(" ", "-"); 
3

En général, votre meilleur pari est d'aller avec une approche d'expression régulière de la liste blanche au lieu de supprimer tous les caractères indésirables, car vous allez certainement manquer certains.

Les réponses ici sont très bien, mais personnellement, je ne voulais pas supprimer entièrement les trémas et les caractères avec des accents. Donc, la solution finale, je suis venu avec se présente comme suit:

public static string CleanUrl(string value) 
{ 
    if (value.IsNullOrEmpty()) 
     return value; 

    // replace hyphens to spaces, remove all leading and trailing whitespace 
    value = value.Replace("-", " ").Trim().ToLower(); 

    // replace multiple whitespace to one hyphen 
    value = Regex.Replace(value, @"[\s]+", "-"); 

    // replace umlauts and eszett with their equivalent 
    value = value.Replace("ß", "ss"); 
    value = value.Replace("ä", "ae"); 
    value = value.Replace("ö", "oe"); 
    value = value.Replace("ü", "ue"); 

    // removes diacritic marks (often called accent marks) from characters 
    value = RemoveDiacritics(value); 

    // remove all left unwanted chars (white list) 
    value = Regex.Replace(value, @"[^a-z0-9\s-]", String.Empty); 

    return value; 
} 

La utilisé la méthode RemoveDiacritics est basée sur la SO answer by Blair Conrad:

public static string RemoveDiacritics(string value) 
{ 
    if (value.IsNullOrEmpty()) 
     return value; 

    string normalized = value.Normalize(NormalizationForm.FormD); 
    StringBuilder sb = new StringBuilder(); 

    foreach (char c in normalized) 
    { 
     if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
      sb.Append(c); 
    } 

    Encoding nonunicode = Encoding.GetEncoding(850); 
    Encoding unicode = Encoding.Unicode; 

    byte[] nonunicodeBytes = Encoding.Convert(unicode, nonunicode, unicode.GetBytes(sb.ToString())); 
    char[] nonunicodeChars = new char[nonunicode.GetCharCount(nonunicodeBytes, 0, nonunicodeBytes.Length)]; 
    nonunicode.GetChars(nonunicodeBytes, 0, nonunicodeBytes.Length, nonunicodeChars, 0); 

    return new string(nonunicodeChars); 
} 

espoir qui aide quelqu'un contesté par slugifying URL et de garder trémas et amis avec leur équivalent amical URL en même temps.

0

La stackoverflow façon le fait se trouve ici:

https://stackoverflow.com/a/25486/142014

optimisé pour la vitesse (« Ceci est la deuxième version, déroulerait 5x plus de performance ») et en prenant soin d'un grand nombre de spécial personnages.

Questions connexes