Comment supprimer les accents et transformer des lettres en caractères ASCII "simples"? [dupliquer]
cette question a déjà une réponse ici:
- PHP: remplacer umlauts avec l'équivalent ASCII 7 bits le plus proche dans une chaîne UTF-8 7 réponses
Quelle est la manière la plus efficace de supprimer les accents d'une chaîne, par exemple ÈâuÑ
devient Eaun
?
Y a-t-il une expression simple, construite de façon à ce que je manque ou une expression régulière?
5 réponses
si vous avez installé iconv, essayez ceci (l'exemple suppose que votre chaîne de caractères est en UTF-8):
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
(iconv est une bibliothèque pour convertir entre tous les types de codages; qu'il est efficace et fourni avec de nombreux PHP distributions par défaut. Par-dessus tout, c'est certainement plus facile et plus à l'épreuve des erreurs que d'essayer de lancer sa propre solution (saviez-vous qu'il y a une "lettre latine N avec une boucle"? Moi non plus .))
j'ai trouvé une solution, qui a fonctionné dans tous mes cas de test (copié 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 "
voir: http://www.php.net/normalizer
EDIT: Cette solution est indépendante de la localisation à l'aide de setlocale() . Un autre avantage sur iconv () est, que même les caractères non latins ne sont pas ignorés.
Edit 2: j'ai découvert, qu'il y a des caractères, qui ne sont pas couverts par la translittération que j'ai posté à l'origine. Any-Latin
traduit le caractère Cyrillique ь
en un caractère qui ne rentre pas dans un jeu de caractères latins: ʹ
( http://en.wikipedia.org/wiki/Prime_%28symbol%29 ). J'ai ajouté [\u0100-\u7fff] remove
pour supprimer tous ces caractères non latins. Je a également ajouté un test au texte;)
je suggère, qu'ils signifient l'alphabet latin et pas un des jeux de caractères latins par Latin
ici. Mais de toute façon - à mon avis, ils devraient le traduire en quelque chose D'ASCII puis dans Latin-ASCII
...
Edit 3: désolé pour un autre changement ici. J'ai dû descendre les caractères à u0080 au lieu de u0100, pour obtenir seulement les caractères ASCII en sortie. Le test ci-dessus est mis à jour.
reprenant ceci à la demande de @palantir ...
je trouve iconv complètement peu fiable, et je n'aime pas les solutions preg_replace et les grands tableaux ... donc, ma façon préférée (et la seule méthode fiable que j'ai trouvé)...
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
vous pouvez utiliser iconv
pour transliter les caractères à US-ASCII simple et puis utiliser une expression régulière pour supprimer les caractères non-alphabétiques:
preg_replace('/[^a-z]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
une autre façon serait d'utiliser le Normalizer pour normaliser à la forme de normalisation KD (NFKD) et puis supprimer la marque caractères:
preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))
Note: je reprends ceci d'une autre question similaire dans l'espoir qu'il soit utile aux autres.
j'ai fini par écrire une bibliothèque PHP basée sur URLify.js du projet Django, car j'ai trouvé iconv () trop incomplet. Vous pouvez le trouver ici:
https://github.com/jbroadway/urlify
S'occupe des caractères latins ainsi que du grec, du turc, du russe, de l'ukrainien, du Tchèque, du polonais et du Letton.