it-swarm-es.com

¿Cómo se eliminan los caracteres no válidos al crear una URL amigable (es decir, cómo se crea una babosa)?

Digamos que tengo esta página web: http://ww.xyz.com/Product.aspx?CategoryId=1

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 nombre de la categoría contiene caracteres extraños (o no válidos para una url). Si el nombre de CategoryId = 2 es "Göra äldre", ¿cuál debería ser la nueva URL?

Lógicamente debería ser: http://ww.xyz.com/Products/Göra äldre pero no funcionará.

En primer lugar debido al espacio (que puedo reemplazar fácilmente por un guión, por ejemplo), pero ¿qué pasa con los caracteres extranjeros? En Asp.net podría usar la función URLEncode que daría algo como esto: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre pero realmente no puedo decir que sea mejor que la URL original (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idealmente, me gustaría generar este, pero ¿cómo puedo hacer esto automáticamente (es decir, convertir caracteres extranjeros en caracteres de URL 'seguros'): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

He ideado 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
Anthony

Depende del idioma que esté usando y de la técnica que quiera usar. Eche un vistazo a este fragmento de JavaScript de la fuente Django, hace exactamente lo que necesita. Supongo que puedes transportarlo fácilmente al idioma que elijas.

Este es el fragmento de Python utilizado en la función slugify Django, es mucho más corto:

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.
    """
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
    return re.sub('[-\s]+', '-', value)

Creo que cada idioma tiene un puerto de esto, ya que es un problema común. Solo Google para slugify + tu idioma.

2
D4V360

Puede agregar un nuevo campo a la tabla Productos que contenga una URL segura y un nombre único para cada producto. Probablemente, esto podría generarse automáticamente inicialmente (sustituyendo caracteres no seguros con el equivalente seguro más cercano - gora-aldre?) Y luego ajustarse según sea necesario.

Dado que el reemplazo de caracteres no seguros no es (siempre) reversible, no es del todo factible hacer este tipo de cosas sobre la marcha.

Alternativamente, construye la URL de esta manera:

http://example.com/products/1234/safe-string

Donde safe-string se crea sobre la marcha reemplazando caracteres inseguros según sea necesario. El número 1234 es la clave del producto. Utiliza la clave para buscar el producto, la 'cadena segura' está allí más para el usuario y los motores de búsqueda.

1
Kris

Dos cosas a tener en cuenta:

  1. La reescritura de URL generalmente no tiene un efecto positivo en los motores de búsqueda (y con frecuencia negativo), por lo que solo debe hacerlo si conoce un efecto positivo medible en la satisfacción del usuario (y, en consecuencia: haga que sus URL sean útiles para los usuarios) .

  2. Si decide hacer una reescritura de URL, debe debe tener los detalles técnicos perfectamente detallados. Por ejemplo, nunca debe tener más de una URL única que muestre el mismo contenido. Asegúrese de usar UTF-8 para la codificación de contenido que no sea ASCII, use enlaces escapados dentro de su contenido y, en general, pruebe en varios navegadores para asegurarse de que las cosas funcionen según lo planeado. Si algo de esto le resulta extraño, le recomiendo no hacer una reescritura de URL por el momento.

FWIW Algunos de los problemas secundarios del motor de búsqueda están cubiertos en http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

El mejor método IMO es lista blanca caracteres en lugar de intentar buscar caracteres no válidos. Sin embargo, los caracteres acentuados como é son bastante comunes (y su URL será extraña sin ellos), por lo que puede convertirlos primero.

En PHP puede usar la función strtr, pero debería poder modificar esto para sus necesidades en asp.net:

strtr(
  'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ',
  'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr'
);

Ahora aquí está tu proceso:

  1. [opcional] Convierta la cadena a minúsculas (generalmente recomendada para URL).
  2. [opcional] Convierta los caracteres acentuados usando el mapeo anterior.
  3. Ejecute su cadena de entrada carácter por carácter.
  4. Puede ser más rápido hacer # 1 y # 2 por carácter en lugar de en toda la cadena, dependiendo de las funciones integradas que tenga.
  5. Si el carácter está en el rango a-z o -9, agréguelo a su nueva cadena, de lo contrario:
    a) Si ya tiene un guión al final de su nueva cadena, ignórelo
    b) Si no, agregue un guión al final de la cadena.
  6. Cuando llegue al final, elimine los guiones iniciales o finales y ¡listo!
1
DisgruntledGoat

Dado que su publicación está etiquetada como ASP.Net: mire este sitio , contiene un código de muestra para reemplazar (la mayoría) del texto con diacríticos (caracteres inválidos que los llama) con su carácter base.

Como Kris ha mencionado, use una identificación única en su URL, como lo hace este sitio. Si no tiene control sobre los ID que se le proporcionaron, debe crear una tabla de traducción, que contenga su ID única, con las ID únicas externas. De esa manera, sus referencias internas también son buenas cuando cambia la ID externa. Junto con su ID única, almacena su "ID optimizada de búsqueda y humana", la que no es tan única, pero se ve bien.

0
GvS

Wikipedia a menudo usa caracteres no latin1 en sus URL. No hay ninguna razón (más allá de que su servidor web no los admita) para no usar estas URL.

Sin embargo; Si tiene que evitar estos caracteres, he encontrado que reemplazarlos con su forma no - diacrítica . La mayoría de las personas que leen esto pueden decir (por contexto) qué se supone que es la Palabra a pesar de que se han eliminado los signos diacríticos.

0
Greg B