Comment supprimer les accents et transformer des lettres en caractères ASCII "simples"? [dupliquer]

cette question a déjà une réponse ici:

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?

44
demandé sur Ripon Al Wasim 2010-08-22 22:21:51

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 .))

51
répondu Piskvor 2016-09-26 10:04:41

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.

44
répondu SimonSimCity 2014-07-28 09:53:37

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');
}
20
répondu neokio 2013-02-11 15:41:26

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))
13
répondu Gumbo 2010-08-22 18:49:58

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.

12
répondu Johnny Broadway 2012-05-01 22:47:11