29 Stimmen

Wie generiere ich eine benutzerfreundliche URL in C#?

Wie kann ich in C# eine benutzerfreundliche URL generieren? Derzeit ersetze ich einfach Leerzeichen durch einen Unterstrich, aber wie könnte ich URLs wie bei Stack Overflow generieren?

Zum Beispiel, wie kann ich folgendes konvertieren:

Wie generiere ich eine benutzerfreundliche URL in C#?

In

wie-generiere-ich-eine-benutzerfreundliche-url-in-C#

47voto

Konrad Rudolph Punkte 503837

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

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

Meiner Meinung nach ist dies nicht der richtige Ort, um dies zu testen. Wenn der Funktion ein leerer String übergeben wird, ist sowieso etwas ernsthaft schief gelaufen. Werfen Sie einen Fehler oder reagieren Sie überhaupt nicht.

// Entfernen Sie alle verbleibenden führenden oder nachfolgenden Leerzeichen
…viel später:
// Entfernen Sie den abschließenden Bindestrich, falls vorhanden

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

// Ersetzen Sie Leerzeichen durch einen einzelnen Bindestrich
title = Regex.Replace(title, @"\s+", "-");
// Falls mehrere Bindestriche entstehen, zu einem einzelnen Bindestrich zusammenführen            
title = Regex.Replace(title, @"\-{2,}", "-");

Im Grunde genommen wieder zweimal die Arbeit: Erstens, verwenden Sie Regex, um mehrere Leerzeichen auf einmal zu ersetzen. Verwenden Sie dann erneut Regex, um mehrere Bindestriche auf einmal zu ersetzen. Zwei Ausdrücke zum Analysieren, zwei Automaten zum Konstruieren im Speicher, zweimal über die Zeichenfolge iterieren, zwei Zeichenfolgen erstellen: All diese Operationen können zu einer einzigen zusammengefasst werden.

Aus dem Stegreif, ohne jegliche Tests, wäre dies eine äquivalente Lösung:

// Alles in Kleinbuchstaben umwandeln
title = title.ToLower();
// Entitäten entfernen
title = Regex.Replace(title, @"&\w+;", "");
// Alles entfernen, was keine Buchstaben, Zahlen, Bindestriche oder Leerzeichen sind
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// Leerzeichen ersetzen
title = title.Replace(' ', '-');
// Bindestriche zusammenführen
title = Regex.Replace(title, @"-{2,}", "-");
// Übermäßige Bindestriche am Anfang abschneiden
title = title.TrimStart(new [] {'-'});
// Falls zu lang, kürzen
if (title.Length > 80)
    title = title.Substring(0, 79);
// Abschließende Bindestriche entfernen
title = title.TrimEnd(new [] {'-'});
return title;

Beachten Sie, dass diese Methode immer dann Zeichenfolgenfunktionen anstelle von Regex-Funktionen und Zeichenfunktionen anstelle von Zeichenfolgenfunktionen verwendet, wenn möglich.

20voto

Jeff Atwood Punkte 62123

So machen wir das. Beachten Sie, dass es wahrscheinlich mehr Randbedingungen gibt, als Sie auf den ersten Blick erkennen.

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

// Entitäten entfernen
title = Regex.Replace(title, @"&\w+;", "");
// Alles entfernen, was keine Buchstaben, Zahlen, Bindestriche oder Leerzeichen sind
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", "");
// Überbleibende führende oder abschließende Leerzeichen entfernen
title = title.Trim();
// Leerzeichen durch einzelnen Bindestrich ersetzen
title = Regex.Replace(title, @"\s+", "-");
// Mehrere Bindestriche zu einem Bindestrich zusammenführen
title = Regex.Replace(title, @"\-{2,}", "-");
// Alles in Kleinbuchstaben umwandeln
title = title.ToLower();
// Wenn zu lang, kürzen
if (title.Length > 80)
    title = title.Substring(0, 79);
// Abschließenden Bindestrich entfernen, falls vorhanden
if (title.EndsWith("-"))
    title = title.Substring(0, title.Length - 1);
return title;

6voto

Matt Hamilton Punkte 193704

Dies geht teilweise (unter Verwendung einer Whitelist gültiger Zeichen):

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

Es liefert jedoch einen String, der mit "--" endet. Vielleicht könnte ein zweiter Regex diese am Anfang/Ende des Strings abschneiden und eventuell alle internen "--" durch "-" ersetzen.

1voto

Arslan Ali Punkte 75

Hier ist eine einfache Funktion, die Ihren String in eine URL umwandeln kann. Sie müssen nur den Titel oder den String übergeben und es wird in eine benutzerfreundliche URL umgewandelt.

    public static string GenerateUrl(string Url)
    {
        string UrlPeplaceSpecialWords = Regex.Replace(Url, @""|['"",&?%\.!()@$^_+=*:#/\\-]", " ").Trim();
        string RemoveMutipleSpaces = Regex.Replace(UrlPeplaceSpecialWords, @"\s+", " ");
        string ReplaceDashes = RemoveMutipleSpaces.Replace(" ", "-");
        string DuplicateDashesRemove = ReplaceDashes.Replace("--", "-");
        return DuplicateDashesRemove.ToLower();
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X