Publié le 15/06/2015
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Supprimer les accents d'une chaine de caracteres

Comment remplacer un caractère accentué par son équivalent sans accent avec PHP, en voila une bonne question. Dès que l'on souhaite passer un string en majuscule ou lorsque l'on met en place de l'url rewriting, les difficultés liées à l'encodage apparaissent. En effet, jongler avec un mot encodé en ISO-8859-1 pour le passer en UTF-8, on peut en perdre son latin !

Convertir les caractères accentués

Pour rendre toutes les langages compatibles entres elles, les textes sont encodés en général en UTF-8. Ainsi, quelques soit la langue de l'internaute, le navigateur internet est capable d'afficher le contenu de la page web sans y caractères bizarres.
Dans le cas de la réécriture d'url ou du passage de mot en minuscule à des mots en majuscule, il est plus simple de revenu à un encodage Ascii de 128 caractères. La class ci-dessous regroupe les fonctions pour s'affranchir des accents et préparer les mots écrits en français pour une insertion dans une base de donnée ou faire des stat.

<?php
/**
 * Enlever les accents dans une chaine de caractères
 * http://www.fobec.com/php5/1170/supprimer-accents-une-chaine-caracteres.html
 * @author Fobec juin 2015
 */
 
class RemoveAccents {
 
    /**
     * Methode 1 utilisant la conversion de l'encodage HTML
     * @param type $initial
     * @return type
     */
    static public function callHTMLEntities($initial) {
        $s = htmlentities($initial);
        $s = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml|grave);/", "$1", $s);
        $s = preg_replace('#&([A-za-z]{2})(?:lig);#', '1', $s); // pour les ligatures e.g. 'œ'
        return $s;
    }
 
    /**
     * Methode 2 avec une table de remplacement
     * @param type $initial
     * @return type
     */
    static public function callReplaceTable($initial) {
        $TB_CONVERT = array(
            'Š' => 'S', 'š' => 's', 'Ð' => 'Dj', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A',
            'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
            'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U',
            'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
            'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i',
            'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u',
            'ú' => 'u', 'û' => 'u', 'ü'=>'u','ý' => 'y', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y', 'ƒ' => 'f', 'œ' => 'oe'
        );
 
        $s = strtr($initial, $TB_CONVERT);
 
        return $s;
    }
 
    /**
     * Supprimer les caractères qui ne sont pas alphanumérique
     * @param type $initial
     */
    static public function clean($initial) {
        $text = preg_replace('/W+/', '-', $initial);
        return $text;
    }
 
    /**
     * Vérifier la conversion à partir d'un mot comportant un accent
     * @param type $initial
     * @param type $rewrite
     * @return boolean
     */
    static public function checkConversion($initial, $rewrite) {
        //Longueur du mot avant conversion
        $len_initial = strlen(utf8_decode($initial));
        //Longueur du mot après conversion
        $len_rewrite = strlen(utf8_decode($rewrite));
        //cas particulier pour 'oe' exemple dans coeur
        if (strpos($initial, 'œ') !== false) {
            $len_initial++;
        }
        //test de la longueur identique
        if ($len_initial != $len_rewrite) {
            return false;
        }
        //test de la présence de caractères interdits
        if (!preg_match('/^[A-Za-z0-9-\s\'.]+$/', $rewrite)) {           
            return false;
        }
 
        return true;
    }
}
?>
 

Remplacer les accents dans une liste de mots


La class RemoveAccents() comporte les fonctions pour retirer les accents d'un mot écrit en français. Elle contient également une fonction de test pour savoir si la conversion s'est correctement effectuée checkConversion(). En théorie, le remplacement des accents ne doit pas modifier le nombre de caractères du mot et aucun caractère bizarre ne devrait subsister.

<?php
 
header('Content-Type: text/html; charset=utf-8');
$f = file_get_contents('./mots-francais.dat');
$n = explode("\n", $f);
 
foreach ($n as $mot) {
    $mot_ascii= RemoveAccents::callReplaceTable($mot_accent);
    if (RemoveAccents::checkConversion($mot_accent, $mot_ascii) != true) {
        echo '<br>Echec de conversion sur ' . $mot_ascii . ' ' . $mot_accent;
    }
}
?>

L'article fait suite à une recherche sur internet concernant la conversion de mot accentué vers un mot sans accent. Le but est de comparer 20 000 mots français pour lequel je retire un à un les accents pour les passer ensuite en lettre majuscule.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
15/06/2015
Visualisation
vu 4477 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 264 articles
|BIO_PSEUDO|
Commentaires récents

Publié par hilflo dans tuto

Tres bon article qui montre bien les subtilites des mutualises de 1and1.
Je l'ai utilise pour un de mes sites en y ajoutant de l'url rewriting pour eviter d'avoir des parametres dans l'url avec cet...

Publié par khaoula dans java

s' il vous plait j'ai un projet de fin d'etude et je veux integrer une carte google maps dans une interface avec java et toujours j'aurais des problemes et merci de votre reponse

Publié par Coll dans java

Excuse moi, mais pourrais tu expliquer un peu plus precisement ce que tu fais lorsque tu convertis en gris je comprends l'idee mais pas ce que chaque action fait precisement et le cacth a la fin. Parc...

Publié par Franzi dans java

Bonjour,
Le code est simple et compile, après être entré dans public void connect, il n'effectue pas this.session.get.transport et s'arrête. Sous eclipse avec Tomcat, j'ob...

Publié par Patrice dans tuto

Bonjour

je cherche a activer mod_headers chez 1and1, impossible de mettre mes jpg en cache, auriez vous une piste ? merci !