Domanda

Come posso generare un URL amichevole in C#?Attualmente sostituisco semplicemente gli spazi con un carattere di sottolineatura, ma come potrei generare URL come Stack Overflow?

Ad esempio, come posso convertire:

Come posso generare un URL amichevole in C#?

In

come-faccio-a-generare-un-url-amichevole-in-C

È stato utile?

Soluzione

Tuttavia, ci sono molte cose che potrebbero essere migliorate nella soluzione di Jeff.

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

IMHO, non è il posto giusto per testarlo.Se alla funzione viene passata una stringa vuota, qualcosa è andato comunque seriamente storto.Lancia un errore o non reagire affatto.

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

Il doppio del lavoro.Considerando che ogni operazione crea una stringa completamente nuova, questo non è positivo, anche se le prestazioni non sono un problema.

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

Ancora una volta, praticamente il doppio del lavoro:Innanzitutto, usa l'espressione regolare per sostituire più spazi contemporaneamente.Quindi, utilizza nuovamente regex per sostituire più trattini contemporaneamente.Due espressioni da analizzare, due automi da costruire in memoria, ripetere due volte la stringa, creare due stringhe:Tutte queste operazioni possono essere ridotte a una sola.

A mente fredda, senza alcun test, questa sarebbe una soluzione equivalente:

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

Si noti che questo metodo utilizza funzioni stringa invece di funzioni regex e funzioni char invece di funzioni stringa quando possibile.

Altri suggerimenti

Ecco come lo facciamo.Tieni presente che probabilmente ci sono più condizioni limite di quanto pensi a prima vista.

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;

Questo arriva in parte (usando una whitelist di caratteri validi):

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

Tuttavia, ti fornisce una stringa che termina con "--".Quindi forse una seconda espressione regolare per tagliare quelli dall'inizio/fine della stringa e magari sostituire qualsiasi "--" interno con "-".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top