2010-07-18 13 views
10

Decir que tengo la página:
http://ww.xyz.com/Product.aspx?CategoryId=1¿Cómo se eliminan los caracteres no válidos al crear una URL amigable (es decir, cómo se crea una babosa)?

Si el nombre de CategoryId = 1 es "Perros" Me gustaría convertir la URL en algo como esto:
http://ww.xyz.com/Products/Dogs

El problema es si el El nombre de categoría contiene caracteres extraños (o inválidos para una url). Si el nombre de CategoryId = 2 es "Göra äldre", ¿cuál debería ser la nueva URL?

Lógicamente que debe ser:
http://ww.xyz.com/Products/Göra äldre
pero no va a funcionar. En primer lugar, por el espacio (que puedo reemplazar fácilmente por un guión, por ejemplo), pero ¿qué pasa con los personajes extranjeros? En Asp.net que podría utilizar la función URLEncode lo que daría algo como esto:
http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
pero no puedo decir que es mejor que la URL original (http://ww.xyz.com/Product.aspx?CategoryId=2)

Tu lugar ideal para generar éste pero ¿cómo puedo hacer esto de forma automática (es decir, la conversión de caracteres extranjeros a los caracteres de URL 'seguros'):
http://ww.xyz.com/Products/Gora-aldre

Respuesta

24

que he llegado con los 2 siguientes métodos de extensión (asp.net/C#):

 public static string RemoveAccent(this string txt) 
    { 
     byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt); 
     return System.Text.Encoding.ASCII.GetString(bytes); 
    } 

    public static string Slugify(this string phrase) 
    { 
     string str = phrase.RemoveAccent().ToLower(); 
     str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars   
     str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space 
     str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes 
     return str; 
    } 
+3

Escribí un método enorme lleno de declaraciones if usando la clase char hasta que encontré esto. Buen material. –

+0

Creo que ISAPI hace lo mismo, pero quiero más control sobre mis URL. Esta es una buena solución. –

+1

Gracias por la función.Tuve que agregar otra pieza al final para reemplazar dos o más guiones con un solo guión. str = System.Text.RegularExpressions.Regex.Replace (str, @ "\ - +", "-"); // convertir varios guiones en un guión –

2

Transliterate caracteres no ASCII a ASCII, utilizando algo como esto:

var str = "éåäöíØ"; 
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "eaaoiO" 

(Source)

+1

¿Qué pasa si algunos caracteres no son cirílicos? Necesito una solución que siempre funcione. – Anthony

+0

Luego necesitará agregar más controles para diferentes tipos de codificación. Desafortunadamente no hay una varita mágica aquí a menos que uses una biblioteca que lo haga todo por ti. – hollsk

+1

Tal vez la biblioteca UnidecodeSharp es lo que estás buscando: http://unidecode.codeplex.com/ – Sjoerd

-1

utilizo la función descrita en http://www.blackbeltcoder.com/Articles/strings/converting-text-to-a-url-friendly-slug. No admite directamente caracteres que no sean en inglés, pero podría actualizarse fácilmente para admitir caracteres adicionales.

Me gusta porque produce una babosa de aspecto muy limpio.

+0

En su función TextToSlug, ¿qué pasa si la cadena para convertir contiene un acento? Por ejemplo, 'prometido', que es una palabra inglesa perfecta. Hay muchos ejemplos similares en inglés. IsLetterOrDigit devolverá true para el carácter é, por lo que terminaría con su url que sería incorrecto ya que idealmente é debería convertirse en e en la url. – Anthony

+0

¿Qué significa "idealmente" aquí? ¿Estás diciendo que el prometido no es válido dentro de una URL? Esto no ha sucedido mientras he estado usando mi código, pero estoy más que feliz de modificarlo si esto causa problemas. –

0

Otra cosa vale la pena considerar:

Si un usuario proporciona una cadena como 好听的音乐 que desea convertir a un título URL amigable, entonces debería considerar el uso de IdnMapping

Por ejemplo:

string urlFriendlyTitle = Slugify(url); 

public static string Slugify(string text) 
{ 
    IdnMapping idnMapping = new IdnMapping(); 
    text = idnMapping.GetAscii(text); 

    text = RemoveAccent(text).ToLower(); 

    // Remove all invalid characters. 
    text = Regex.Replace(text, @"[^a-z0-9\s-]", ""); 

    // Convert multiple spaces into one space 
    text = Regex.Replace(text, @"\s+", " ").Trim(); 

    // Replace spaces by underscores. 
    text = Regex.Replace(text, @"\s", "_"); 

    return text; 
} 

public static string RemoveAccent(string text) 
{ 
    byte[] bytes = Encoding.GetEncoding("Cyrillic").GetBytes(text); 

    return Encoding.ASCII.GetString(bytes); 
} 

Sin esto, 好听的音乐 se convertirá en string.Empty. Con esto, xn--fjqr6lw2ek78az68a que es punycode

Cuestiones relacionadas