45 votes

Comment supprimer les accents et transformer les lettres en caractères ASCII "simples"?

Quelle est la façon la plus efficace de supprimer les accents d'une chaîne, par exemple ÈâuÑ devient Eaun ?

Existe-t-il une manière simple et intégrée de me manquer ou une expression régulière?

53voto

Piskvor Points 46986

Si vous avez installé iconv, essayez ceci (l'exemple suppose que votre chaîne d'entrée est en UTF-8):

 echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
 

(iconv est une bibliothèque pour convertir entre toutes sortes d'encodages; elle est efficace et incluse avec de nombreuses distributions PHP par défaut. Surtout, elle est certainement plus facile et plus résistante aux erreurs que d'essayer de lancer votre propre solution (saviez-vous qu'il existe un "Lettre latine N avec une boucle"? Moi non plus .))

49voto

SimonSimCity Points 1403

J'ai trouvé une solution, qui a travaillé dans tous mes cas de test (copié à partir 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 la fonction setlocale(). Autre avantage, par rapport iconv() , c'est que même les caractères non latins ne sont pas ignorés.

EDIT2: j'ai découvert, qu'il y a certains personnages, qui ne sont pas couverts par la translittération j'ai posté à l'origine. Any-Latin traduit le caractère cyrillique ь d'un personnage, qui ne rentre pas dans un latin de jeu de caractères: ʹ (http://en.wikipedia.org/wiki/Prime_%28symbol%29). J'ai ajouté [\u0100-\u7fff] remove de supprimer tous les caractères non latins. J'ai également ajouté un test pour le texte ;)

Je pense qu'ils veulent dire l'alphabet latin et non pas un des caractères latins-les jeux en Latin ici. Mais de toute façon, à mon avis, ils devraient translittérer à quelque chose ASCII puis, en Latin-ASCII ...

EDIT3: Désolé pour l'autre changement ici. J'ai dû prendre les personnages en bas à u0080 au lieu de u0100, pour obtenir uniquement des caractères ASCII en sortie. Le test ci-dessus est mis à jour.

20voto

neokio Points 2461

Republier 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ée) est ...

 function toASCII( $str )
{
    return strtr(utf8_decode($str), 
        utf8_decode(
        'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
        'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
 

13voto

Gumbo Points 279147

Vous pouvez utiliser iconv pour translittérer les caractères en US-ASCII ordinaire, 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 normalisateur pour normaliser le formulaire de normalisation KD (NFKD) , puis de supprimer les caractères de marque:

 preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))
 

12voto

Johnny Broadway Points 441

Remarque: je republie cela à partir d'une autre question similaire dans l'espoir que cela 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

Gère les caractères latins ainsi que le grec, le turc, le russe, l'ukrainien, le tchèque, le polonais et le letton.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X