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.