Pregunta

¿Cómo puedo generar una URL amigable en C#?Actualmente, simplemente reemplazo los espacios con un guión bajo, pero ¿cómo haría para generar URL como Stack Overflow?

Por ejemplo, ¿cómo puedo convertir?

¿Cómo genero una URL amigable en C#?

En

¿Cómo puedo generar una URL amigable en C?

¿Fue útil?

Solución

Sin embargo, hay varias cosas que podrían mejorarse en la solución de Jeff.

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

En mi humilde opinión, no es el lugar para probar esto.Si a la función se le pasa una cadena vacía, algo salió muy mal de todos modos.Lanza un error o no reaccionas en absoluto.

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

El doble de trabajo.Teniendo en cuenta que cada operación crea una cadena completamente nueva, esto es malo, incluso si el rendimiento no es 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,}", "-");

De nuevo, básicamente el doble de trabajo:Primero, use expresiones regulares para reemplazar varios espacios a la vez.Luego, use expresiones regulares nuevamente para reemplazar varios guiones a la vez.Dos expresiones para analizar, dos autómatas para construir en la memoria, iterar dos veces sobre la cadena, crear dos cadenas:Todas estas operaciones se pueden reducir a una sola.

Desde lo alto de mi cabeza, sin ninguna prueba, esta sería una solución 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;

Tenga en cuenta que este método utiliza funciones de cadena en lugar de funciones de expresiones regulares y funciones de caracteres en lugar de funciones de cadena siempre que sea posible.

Otros consejos

Así es como lo hacemos.Tenga en cuenta que probablemente haya más condiciones de borde de las que cree a primera 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;

Esto llega en parte del camino (usando una lista blanca de caracteres válidos):

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

Sin embargo, le proporciona una cadena que termina en "--".Entonces, tal vez una segunda expresión regular para recortar las del principio/final de la cadena, y tal vez reemplazar cualquier "--" interno por "-".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top