2008-09-01 9 views
26

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

Par exemple, comment puis-je convertir:

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

Dans

how-do-i-generate-un facile à url en C

Répondre

46

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

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

À mon humble avis, pas l'endroit pour le tester. Si la fonction passe une chaîne vide, quelque chose ne va pas du tout. Jetez 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 le travail. Considérant que chaque opération crée une chaîne entière, c'est mauvais, même si la performance n'est pas un problème. Encore une fois, fondamentalement deux fois le travail: D'abord, utilisez regex pour remplacer plusieurs espaces à la fois. Ensuite, utilisez à nouveau regex pour remplacer plusieurs tirets à la fois. Deux expressions à analyser, deux automates à construire en mémoire, itérer deux fois sur la chaîne, créer deux chaînes: Toutes ces opérations peuvent être réduites à une seule.

Du haut de ma tête, sans aucun test que ce soit, 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 les fonctions de chaîne au lieu des fonctions regex et fonctions char au lieu des fonctions de chaîne chaque fois que possible .

+1

Grande réponse merci, j'ai également ajouté URL = Regex.Replace (URL, @ "<(.|\n)*?>", ""); pour supprimer les balises HTML comme "mon article ici" se tournera vers "my-barticleb-here" –

+0

Un chemin ne peut pas non plus se terminer par une période. Vous ne savez pas non plus pourquoi vous utilisez new [] {'-'}, alors que vous pourriez juste utiliser '-'. –

18

Voilà comment nous le faisons. Notez qu'il ya probablement plus de conditions de pointe que vous vous rendez compte à 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; 
+8

Cette réponse est rejetée. Jeff met à jour sa réponse originale avec une nouvelle version du code: http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486 # 25486 –

4

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

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

Il fait, cependant , vous donne une chaîne qui se termine par "-". Donc peut-être une deuxième regex pour couper ceux du début/fin de la chaîne, et peut-être remplacer n'importe quel interne "-" à "-".

Questions connexes