php - ejemplos - reglas del acento diacritico
Cómo manejar signos diacríticos(acentos) al reescribir ''URLs bonitas'' (6)
Ahora las personas pueden escribir títulos que contengan cualquier carácter UTF-8, pero la mayoría no están permitidos en la URL.
Por el contrario, la mayoría están permitidos. Vea, por ejemplo, las URL de Wikipedia: cosas como http://en.wikipedia.org/wiki/Café (también conocido como http://en.wikipedia.org/wiki/Caf%C3%A9 ) se muestran muy bien, incluso si el resaltador de StackOverflow no funciona t escogerlos correctamente :-)
El truco es leerlos de manera confiable en cualquier entorno de alojamiento; hay problemas con los servidores CGI y Windows, particularmente IIS, por ejemplo.
Reescribo las URL para incluir el título de blogs de viaje generados por los usuarios.
Lo hago tanto para la legibilidad de las URL como para fines de SEO.
http://www.example.com/gallery/280-Gorges_du_Todra/
El primer entero es la identificación, el resto es para nosotros los humanos (pero es irrelevante para solicitar el recurso).
Ahora las personas pueden escribir títulos que contengan cualquier carácter UTF-8, pero la mayoría no están permitidos en la URL. Mi audiencia generalmente habla inglés, pero como viajan, les gusta incluir nombres como
Aït Ben Haddou
¿Cuál es la forma correcta de traducir esto para mostrar en una URL usando PHP en Linux?
Hasta ahora he visto varias soluciones:
simplemente quite todos los caracteres no permitidos, reemplace los espacios, esto tiene resultados extraños:
''Aït Ben Haddou'' → /gallery/280-At_Ben_Haddou/
No es realmente útil.simplemente quite todos los caracteres no permitidos, reemplace espacios, deje charcode (stackoverflow.com) muy probablemente debido al ''martillo de regex'' utilizado
esto da resultados extraños:''tést tést'' → /questions/0000/t233st-t233st
traducir a ''equivalente más cercano''
''Aït Ben Haddou'' → /gallery/280-Ait_Ben_Haddou/
Pero esto va mal para el alemán; por ejemplo ''ü'' debe ser transliterado ''ue''.
Para mí, como holandés, el 3er resultado "se ve mejor".
Sin embargo, estoy bastante seguro de que (1) muchas personas tendrán una opinión diferente y (2) es simplemente incorrecta en el ejemplo alemán.
Otro problema con la tercera opción es: ¿cómo encontrar todos los caracteres posibles que se pueden convertir a un equivalente de 7 bits?
Entonces la pregunta es:
lo que, en su opinión, es el resultado más deseable. (dentro de los límites de la tecnología)
Cómo resolverlo técnicamente (alcanza el resultado deseado) con PHP.
En definitiva, tendrá que renunciar a la idea de "correcto" para este problema. Traducir la cadena, sin importar cómo lo hagas, destruye la precisión en nombre de la compatibilidad y la legibilidad. Las tres opciones son igualmente compatibles, pero los números 1 y 2 sufren en términos de legibilidad. Así que simplemente corre con él y ve por lo que se vea mejor, opción # 3.
Sí, las traducciones son incorrectas para el alemán, pero a menos que empieces a exigir a tus usuarios que especifiquen en qué idioma están sus títulos (y los restrinjas a uno solo), no vas a resolver ese problema sin mucho más esfuerzo de lo que vale. (Por ejemplo, ejecutar cada palabra en el título a través de diccionarios para cada idioma conocido y traducir los signos diacríticos de esa palabra según las reglas de su lenguaje funcionaría , pero es excesivo).
Alternativamente, si el alemán es una preocupación mayor que otros idiomas, haga que su traducción siempre use la versión alemana cuando exista: a → ae
, ë
→ e
, ï
→ i
, ö
→ oe
, ü
→ ue
.
Editar:
Ah, y en cuanto al método real, traduciría los casos especiales, si los hubiera, a través de str_replace
, y luego usar iconv
para el resto:
$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv(''UTF-8'', ''US-ASCII//TRANSLIT'', $text);
Para mí, el tercero es más legible.
Puede usar un pequeño diccionario, por ejemplo, ï -> i
y ü -> ue
para especificar cómo desea traducir varios caracteres.
Buen tema, tuve el mismo problema hace un tiempo.
Así es como lo arreglé:
function title2url($string=null){
// return if empty
if(empty($string)) return false;
// replace spaces by "-"
// convert accents to html entities
$string=htmlentities(utf8_decode(str_replace('' '', ''-'', $string)));
// remove the accent from the letter
$string=preg_replace(array(''@&([a-zA-Z]){1,2}(acute|grave|circ|tilde|uml|ring|elig|zlig|slash|cedil|strok|lig){1};@'', ''@&[euro]{1};@''), array(''${1}'', ''E''), $string);
// now, everything but alphanumeric and -_ can be removed
// aso remove double dashes
$string=preg_replace(array(''@[^a-zA-Z0-9/-_]@'', ''@[/-]{2,}@''), array('''', ''-''), html_entity_decode($string));
}
Así es como funciona mi función:
- Convierta a entidades html
- Pelar los acentos
- Eliminar todos los caracteres extraños restantes
Esta es una buena función:
function friendlyURL($string) {
setlocale(LC_CTYPE, ''en_US.UTF8'');
$string = iconv(''UTF-8'', ''ASCII//TRANSLIT//IGNORE'', $string);
$string = str_replace('' '', ''-'', $string);
$string = preg_replace(''///s+/'', ''-'', $string);
$string = strtolower($string);
return $string;
}
Como nota al margen interesante, en SO, nada parece importar después de la ID, este es un enlace a esta página:
Cómo manejar signos diacríticos (acentos) al reescribir ''URLs bonitas''
Obviamente, la motivación es permitir los cambios de título sin romper los enlaces, y es posible que desee considerar esa característica también.