Pergunta

Como posso gerar uma URL amigável em C#?Atualmente eu simplesmente substituo espaços por um sublinhado, mas como eu faria para gerar URLs como Stack Overflow?

Por exemplo, como posso converter:

Como faço para gerar uma URL amigável em C#?

Em

como faço para gerar um URL amigável em C

Foi útil?

Solução

Porém, há várias coisas que poderiam ser melhoradas na solução de Jeff.

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

IMHO, não é o lugar para testar isso.Se a função receber uma string vazia, algo deu muito errado de qualquer maneira.Lance um erro ou não reaja.

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

O dobro do trabalho.Considerando que cada operação cria uma string totalmente nova, isso é ruim, mesmo que o desempenho não seja um 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,}", "-");

Novamente, basicamente o dobro do trabalho:Primeiro, use regex para substituir vários espaços de uma vez.Em seguida, use regex novamente para substituir vários traços de uma vez.Duas expressões para analisar, dois autômatos para construir na memória, iterar duas vezes na string, criar duas strings:Todas essas operações podem ser resumidas em uma única.

Pensando bem, sem qualquer teste, esta seria uma solução 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;

Observe que este método usa funções de string em vez de funções regex e funções char em vez de funções de string sempre que possível.

Outras dicas

Veja como fazemos isso.Observe que provavelmente há mais condições de limite do que você imagina à primeira 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;

Isso faz parte do caminho (usando uma lista de permissões de caracteres válidos):

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

No entanto, fornece uma string que termina com "--".Então, talvez um segundo regex para aparar aqueles do início/fim da string e talvez substituir qualquer "--" interno por "-".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top