Question

Comment puis-je générer une URL conviviale en C# ?Actuellement, je remplace simplement les espaces par un trait de soulignement, mais comment puis-je générer des URL comme Stack Overflow ?

Par exemple, comment puis-je convertir :

Comment générer une URL conviviale en C# ?

Dans

comment-générer-une-url-conviviale-en-C

Était-ce utile?

La solution

Il y a cependant plusieurs choses qui pourraient être améliorées dans la solution de Jeff.

if (String.IsNullOrEmpty(title)) return "";

À mon humble avis, ce n'est pas l'endroit pour tester ça.Si la fonction reçoit une chaîne vide, quelque chose s'est de toute façon sérieusement mal passé.Lancez une erreur ou ne réagissez pas du tout.

// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one

Deux fois plus de travail.Étant donné que chaque opération crée une toute nouvelle chaîne, c'est mauvais, même si les performances ne sont pas un problème.

// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");

Encore une fois, en gros, deux fois plus de travail :Tout d’abord, utilisez l’expression régulière pour remplacer plusieurs espaces à la fois.Ensuite, utilisez à nouveau l’expression régulière pour remplacer plusieurs tirets à la fois.Deux expressions à analyser, deux automates à construire en mémoire, parcourir deux fois la chaîne, créer deux chaînes :Toutes ces opérations peuvent être regroupées en une seule.

De mémoire, sans aucun test, ce serait une solution équivalente :

// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;

Notez que cette méthode utilise des fonctions de chaîne au lieu de fonctions regex et des fonctions char au lieu de fonctions de chaîne lorsque cela est possible.

Autres conseils

Voici comment nous procédons.Notez qu'il y a probablement plus de conditions de bord que vous ne le pensez à première vue.

if (String.IsNullOrEmpty(title)) return "";

// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", "");
// remove any leading or trailing spaces left over
title = title.Trim();
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");
// make it all lower case
title = title.ToLower();
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dash, if there is one
if (title.EndsWith("-"))
    title = title.Substring(0, title.Length - 1);
return title;

Cela fait une partie du chemin (en utilisant une liste blanche de caractères valides) :

new Regex("[^a-zA-Z-_]").Replace(s, "-")

Cependant, il vous donne une chaîne qui se termine par "--".Alors peut-être une deuxième expression régulière pour couper celles du début/fin de la chaîne, et peut-être remplacer tout "--" interne par "-".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top