web-dev-qa-db-fra.com

PHP: Remplacer les trémas par le 7 bits le plus proche ASCII équivalent dans une chaîne UTF-8

Ce que je veux faire est de supprimer tous les accents et les trémas d'une chaîne, en transformant "lärm" en "larm" ou "andré" en "andre". Ce que j’ai essayé de faire, c’est d’utf8_decoder la chaîne, puis d’utiliser strtr, mais comme mon fichier source est enregistré au format UTF-8, je ne peux pas saisir les caractères ISO-8859-15 pour tous les trémas - l’éditeur insère le Caractères UTF-8.

De toute évidence, une solution à ce problème consisterait à inclure un fichier ISO-8859-15, mais il doit exister un meilleur moyen que d’inclure un autre fichier include obligatoire?

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

UPDATE: Peut-être étais-je un peu inexact avec ce que j'essaie de faire: je ne veux pas réellement supprimer les trémas, mais les remplacer par leur équivalent "un caractère ASCII" le plus proche.

40
BlaM
iconv("utf-8","ascii//TRANSLIT",$input);

Extended exemple

51
Vinko Vrsalovic

Un petit truc qui ne nécessite pas de paramétrage de paramètres régionaux ni de tables de traduction volumineuses:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|Grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

La seule condition pour que cela fonctionne correctement est de sauvegarder vos fichiers au format UTF-8 (comme vous devriez déjà le faire).

26
Alix Axel

vous pouvez aussi essayer ceci

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

mais vous devez avoir http://php.net/manual/fr/book.intl.php available

5
gabo

Ok, j'ai trouvé une solution évidente moi-même, mais ce n'est pas la meilleure en matière de performance ...

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

Pour les utilisateurs arabes et persans, je recommande cette méthode pour supprimer les signes diacritiques:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

Vous pouvez utiliser ces codes Asci (ces codes sont des codes Asci et non Unicode) dans les éditeurs Windows Taper les signes diacritiques directement ou maintenir Alt + (saisir le code de caractère diacritique) Ce sont les codes

(0243) ـِ (0246) (0245) (0240) (0242) (0241) (0250) (0248) ـ (0220)

0
ganji

J'ai trouvé que celui-ci donne les résultats les plus cohérents en français et en allemand . Avec la balise méta définie sur utf-8, je l'ai placé dans une fonction pour renvoyer une ligne d'un tableau de mots et cela fonctionne parfaitement.

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 
0
jay

Si vous utilisez WordPress, vous pouvez utiliser la fonction intégrée remove_accents( $string )

https://codex.wordpress.org/Function_Reference/remove_accents

Cependant, j’ai remarqué un bug: cela ne fonctionne pas sur une chaîne avec un seul caractère.

0
youtag