php - ¿Cómo eliminar acentos y convertir letras en caracteres ASCII "simples"?
regex string (5)
Esta pregunta ya tiene una respuesta aquí:
¿Cuál es la forma más eficiente de eliminar acentos de una cadena, por ejemplo, ÈâuÑ
convierte en Eaun
?
¿Hay una forma simple, construida en la que me falta o una expresión regular?
Encontré una solución que funcionaba en todos mis casos de prueba (copiada de http://php.net/manual/en/transliterator.transliterate.php ):
var_dump(transliterator_transliterate(''Any-Latin; Latin-ASCII; [/u0080-/u7fff] remove'',
"A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi ¦"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi "
ver: http://www.php.net/normalizer
EDITAR: esta solución es independiente de la configuración regional utilizando setlocale () . Otro beneficio sobre iconv () es que incluso los caracteres no latinos no se ignoran.
EDIT2: Descubrí que hay algunos personajes que no están cubiertos por la transliteración que publiqué originalmente. Any-Latin
traduce el carácter cirílico ь
a un carácter, que no encaja en un conjunto de caracteres latinos: ʹ
( http://en.wikipedia.org/wiki/Prime_%28symbol%29 ). He agregado [/u0100-/u7fff] remove
para eliminar todos estos caracteres no latinos. También agregué una prueba al texto;)
Sugiero que se refieran al alfabeto latino y no a uno de los conjuntos de caracteres latinos del Latin
aquí. Pero de todos modos, en mi opinión, deberían transliterarlo a algo ASCII luego en Latin-ASCII
...
EDIT3: Perdón por otro cambio aquí. Tuve que llevar los caracteres a u0080 en lugar de u0100, para obtener solo caracteres ASCII como salida. La prueba anterior se actualiza.
Nota: Estoy reubicando esto de otra pregunta similar con la esperanza de que sea útil para otros.
Terminé escribiendo una biblioteca PHP basada en URLify.js del proyecto Django, ya que encontré que iconv () era demasiado incompleta. Lo puedes encontrar aquí:
https://github.com/jbroadway/urlify
Maneja caracteres latinos, así como griego, turco, ruso, ucraniano, checo, polaco y letón.
Puede usar iconv
para transcribir los caracteres en US-ASCII simple y luego usar una expresión regular para eliminar caracteres no alfabéticos:
preg_replace(''/[^a-z]/i'', '''', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
Otra forma sería usar el Normalizer para normalizar el Formulario de normalización KD (NFKD) y luego eliminar los caracteres de marca:
preg_replace(''//p{Mn}/u'', '''', Normalizer::normalize($text, Normalizer::FORM_KD))
Reposicionando esto a petición de @palantir ...
Encuentro iconv completamente poco fiable, y me desagradan las soluciones preg_replace y las grandes matrices ... así que mi forma favorita (y el único método confiable que he encontrado) es ...
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
''ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ''),
''SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'');
}
Si tiene iconv instalado, intente esto (el ejemplo asume que su cadena de entrada está en UTF-8):
echo iconv(''UTF-8'', ''ASCII//TRANSLIT'', $string);
(iconv es una biblioteca para convertir entre todo tipo de codificaciones; es eficiente y se incluye con muchas distribuciones de PHP por defecto. Más que nada, es definitivamente más fácil y más a prueba de errores que tratar de rodar su propia solución (¿sabías que hay una "Letra latina N con un rizo"? Yo tampoco .))