2008-09-01 18 views
26

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

Por ejemplo ¿Cómo puedo convertir:

¿Cómo se genera una URL amigable en C#?

En

cómo-do-i-generate-a-friendly-url-en-C

Respuesta

46

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 la función se pasa una cadena vacía, algo salió muy mal de todos modos. Lanzar un error o no reaccionar en absoluto.

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

Dos veces el 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,}", "-"); 

Una vez más, básicamente el doble de trabajo: Primero, use regex para reemplazar múltiples espacios a la vez. Luego, usa regex nuevamente para reemplazar múltiples 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 pueden colapsarse en una sola.

De la parte superior de mi cabeza, sin ninguna prueba en absoluto, esto 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 las funciones de expresiones regulares y funciones de char en lugar de funciones de cadena siempre que sea posible .

+1

Respuesta excelente gracias, también agregué URL = Regex.Replace (URL, @ "<(.|\n)*?>", ""); para eliminar etiquetas HTML como "mi artículo aquí" se convertirá en "my-barticleb-aquí" –

+0

Una ruta tampoco puede finalizar con un punto. Además, no estoy seguro de por qué usa new [] {'-'}, cuando podría usar '-'. –

18

Así es como lo hacemos. Tenga en cuenta que es probable que haya más condiciones de borde de lo 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; 
+8

Esta respuesta no está actualizada. Jeff actualiza su respuesta original con una nueva versión del código: http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486 # 25486 –

4

Esto consigue una parte del camino allí (usando una lista blanca de caracteres válidos):

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

Lo hace, sin embargo , darle una cadena que termine con "-". Así que tal vez una segunda expresión regular para recortar los del principio/final de la cadena, y tal vez reemplazar cualquier "-" interno a "-".

Cuestiones relacionadas