¿Cuál es una buena expresión regular completa o algún otro proceso que tomaría el título:
¿Cómo se cambia un título para que sea parte de la URL como Stack Overflow?
y convertirlo en
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
que se usa en las URL compatibles con SEO en Stack Overflow?
El entorno de desarrollo que estoy usando es Ruby on Rails , pero si hay otras soluciones específicas de plataforma (.NET, PHP, Django ), me encantaría verlas también.
Estoy seguro de que yo (u otro lector) se encontrará con el mismo problema en una plataforma diferente en el futuro.
Estoy usando rutas personalizadas, y principalmente quiero saber cómo alterar la cadena para que se eliminen todos los caracteres especiales, todo está en minúsculas y se reemplaza todo el espacio en blanco.
regex
language-agnostic
seo
friendly-url
slug
wusher
fuente
fuente
Respuestas:
Así es como lo hacemos. Tenga en cuenta que probablemente haya más condiciones de borde de las que cree a primera vista.
Esta es la segunda versión, desenrollada para 5 veces más rendimiento (y sí, la comparé). Pensé que lo optimizaría porque esta función se puede llamar cientos de veces por página.
Para ver la versión anterior del código que reemplazó (pero es funcionalmente equivalente y 5 veces más rápido), vea el historial de revisiones de esta publicación (haga clic en el enlace de la fecha).
Además, el
RemapInternationalCharToAscii
código fuente del método se puede encontrar aquí .fuente
RemapInternationalCharToAscii()
función está allí meta.stackexchange.com/questions/7435/…if (prevdash) sb.Length -= 1; return sb.ToString();
lugar de la últimaif
declaración.sb.Length == maxlen break;
tiene errores si el signo en maxLenght-1 es "ß" se convierte en "ss"sb.Length == maxlene
nunca será cierto, es mejor probarlo(sb.Length > = maxlen)
.Aquí está mi versión del código de Jeff. He realizado los siguientes cambios:
La conversión del caso ahora también es opcional.
Para obtener más detalles, las pruebas unitarias y una explicación de por qué el esquema de URL de Facebook es un poco más inteligente que Stack Overflows, tengo una versión ampliada de esto en mi blog .
fuente
if (i == maxlen) break;
para que,if (sb.Length == maxlen) break;
en su lugar, si pasa una cadena con muchos espacios en blanco / caracteres no válidos, aún pueda obtener una barra de la longitud deseada, mientras que el código tal como está puede terminar truncarlo masivamente (por ejemplo, considere el caso en el que comienza con 80 espacios ...). Y un punto de referencia aproximado de 10,000,000 iteraciones contra el código de Jeff mostró que era aproximadamente la misma velocidad.Deberá configurar una ruta personalizada para apuntar la URL al controlador que lo manejará. Como está utilizando Ruby on Rails, aquí hay una introducción al uso de su motor de enrutamiento.
En Ruby, necesitará una expresión regular como ya sabe y aquí está la expresión regular para usar:
fuente
También puede usar esta función de JavaScript para la generación en forma de las babosas (esta se basa en / copiada de Django ):
fuente
En buena medida, aquí está la función PHP en WordPress que lo hace ... Creo que WordPress es una de las plataformas más populares que utiliza enlaces sofisticados.
Esta función, así como algunas de las funciones de soporte, se pueden encontrar en wp-includes / formatting.php.
fuente
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
y encontrar elwp-includes/formatting.php
archivo enSi está utilizando Rails edge, puede confiar en Inflector.parametrize ; este es el ejemplo de la documentación:
Además, si necesita manejar caracteres más exóticos como acentos (éphémère) en versiones anteriores de Rails, puede usar una mezcla de PermalinkFu y DiacriticsFu :
fuente
No estoy familiarizado con Ruby on Rails, pero el siguiente es un código PHP (no probado). Probablemente pueda traducir esto muy rápidamente a Ruby on Rails si lo encuentra útil.
Espero que esto ayude.
fuente
No sé mucho sobre Ruby o Rails, pero en Perl, esto es lo que haría:
Acabo de hacer una prueba rápida y parece funcionar. Esperemos que esto sea relativamente fácil de traducir a Ruby.
fuente
Implementación de T-SQL, adaptada de dbo.UrlEncode :
fuente
Sé que es una pregunta muy antigua, pero dado que la mayoría de los navegadores ahora admiten URL unicode , encontré una gran solución en XRegex que convierte todo excepto las letras (en todos los idiomas a '-').
Eso se puede hacer en varios lenguajes de programación.
El patrón es
\\p{^L}+
y luego solo necesita usarlo para reemplazar todas las letras que no sean '-'.Ejemplo de trabajo en node.js con módulo xregex .
fuente
Suponiendo que su clase de modelo tiene un atributo de título, simplemente puede anular el método to_param dentro del modelo, así:
Este episodio de Railscast tiene todos los detalles. También puede asegurarse de que el título solo contenga caracteres válidos usando esto:
fuente
El código de Brian, en Ruby:
downcase
convierte la cadena a minúsculas,strip
elimina espacio inicial y final, la primeragsub
llamada g lobally sub espacios stitutes con guiones, y el segundo elimina todo lo que no sea una letra o un guión.fuente
Hay un pequeño complemento de Ruby on Rails llamado PermalinkFu , que hace esto. El método de escape realiza la transformación en una cadena que es adecuada para una URL . Echa un vistazo al código; Ese método es bastante simple.
Para eliminar caracteres no ASCII , utiliza iconv lib para traducir a 'ascii // ignore // translit' de 'utf-8'. Los espacios se convierten en guiones, todo se descarta, etc.
fuente
Puede usar el siguiente método auxiliar. Puede convertir los caracteres Unicode.
fuente
Aquí está mi versión (más lenta pero divertida de escribir) del código de Jeff:
Mi cadena de prueba:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
fuente
La solución stackoverflow es excelente, pero el navegador moderno (excluyendo IE, como siempre) ahora maneja muy bien la codificación utf8:
Así que actualicé la solución propuesta:
Código completo en Pastebin
Editar: Aquí está el código para el
RemapInternationalCharToAscii
método (que falta en el pastebin).fuente
Me gustó la forma en que esto se hace sin usar expresiones regulares , así que lo porté a PHP. Acabo de agregar una función llamada
is_between
para verificar los caracteres:fuente
Ahora todos los navegadores manejan muy bien la codificación utf8, por lo que puede usar el método WebUtility.UrlEncode , es como HttpUtility.UrlEncode usado por @giamin pero funciona fuera de una aplicación web.
fuente
Porté el código a TypeScript. Se puede adaptar fácilmente a JavaScript.
Estoy agregando un
.contains
método alString
prototipo, si está apuntando a los últimos navegadores o ES6, puede usar.includes
en su lugar.fuente
No no no. Todos ustedes están muy equivocados. Excepto por las cosas de diacríticos-fu, estás llegando allí, pero ¿qué pasa con los personajes asiáticos (lástima de los desarrolladores de Ruby por no considerar a sus hermanos nihonjin ).
Firefox y Safari muestran caracteres que no son ASCII en la URL y, francamente, se ven geniales. Es bueno admitir enlaces como ' http://somewhere.com/news/read/ お 前 た ち は ア ホ じ ゃ な い か い '.
Así que aquí hay un código PHP que lo hará, pero lo acabo de escribir y no lo he probado en estrés.
Ejemplo:
Salidas: コ リ ン -and- ト ー マ ス -and- ア ー ノ ル ド
El '-y-' se debe a que & 'se cambia a' -y- '.
fuente