2008-09-01 6 views
26

Wie kann ich eine benutzerfreundliche URL in C# erstellen? Derzeit ersetze ich Leerzeichen einfach durch einen Unterstrich, aber wie würde ich URLs wie Stack Overflow generieren?Wie erzeuge ich eine benutzerfreundliche URL in C#?

Zum Beispiel, wie kann ich konvertieren:

Wie kann ich eine freundliche URL in C# zu generieren?

In

wie-do-i-generate-a-friendly-url-in-C

Antwort

46

Es gibt jedoch einige Dinge, die in Jeffs Lösung verbessert werden könnten.

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

IMHO, nicht der Ort, um dies zu testen. Wenn die Funktion eine leere Zeichenfolge übergeben wird, ist etwas sehr schief gelaufen. Wirf einen Fehler oder reagiere überhaupt nicht.

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

Zweimal die Arbeit. Wenn man bedenkt, dass jede Operation eine ganz neue Zeichenfolge erzeugt, ist dies schlecht, auch wenn die Leistung kein Problem darstellt.

// 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,}", "-"); 

Noch einmal, im Grunde doppelt so viel Arbeit: Erstens, Regex verwenden, um mehrere Leerzeichen auf einmal zu ersetzen. Verwenden Sie dann erneut Regex, um mehrere Bindestriche gleichzeitig zu ersetzen. Zwei Ausdrücke zu analysieren, zwei Automaten im Speicher zu konstruieren, zweimal über die Zeichenfolge zu iterieren, zwei Zeichenfolgen zu erstellen: All diese Operationen können auf eine einzige reduziert werden.

Aus der Spitze von meinem Kopf, ohne Prüfung auch immer, wäre dies eine gleichwertige Lösung sein:

// 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; 

Beachten Sie, dass diese Methode String-Funktionen anstelle von Regex Funktionen und char Funktionen anstelle von String-Funktionen, wann immer möglich verwendet .

+1

Tolle Antwort Danke, ich habe auch URL = Regex.Replace (URL, @ "<(.|\n)*?>", ""); HTML-Tags zu entfernen, wie "mein Artikel hier" wird zu "my-barticleb-here" –

+0

Ein Pfad kann auch nicht mit einem Punkt enden. Auch nicht sicher, warum Sie new [] {'-'} verwenden, wenn Sie einfach '-' verwenden können. –

18

Hier ist, wie wir es tun. Beachten Sie, dass es wahrscheinlich mehr Randbedingungen sind, als man auf den ersten Blick erkennen ..

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

Diese Antwort ist veraltet. Jeff aktualisiert seine ursprüngliche Antwort mit einer neuen Version des Codes: http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486 # 25486 –

4

Dieser Teil des Weges wird es (eine weiße Liste der gültigen Zeichen verwenden):

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

Es hat jedoch , geben Sie eine Zeichenfolge, die mit "-" endet. Also vielleicht eine zweite Regex, um diese am Anfang/Ende der Saite zu trimmen und vielleicht jedes interne "-" durch "-" zu ersetzen.

Verwandte Themen