IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Résultat bizarre de mon preg_replace : doublement des e [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Par défaut Résultat bizarre de mon preg_replace : doublement des e
    Bonjour à tous,

    Je reste perplexe devant le résultat obtenu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function NomToCodeUrl($in) {
    	$search = array ('@[éèêëÊË]@i','@[àâäÂÄ\@]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_-]@');
    	$replace = array ('e','a','i','u','o','c','-','');
    	//la fonction rtrim supprime les espaces en fin de chaine
    	return rtrim(preg_replace($search, $replace, $in));
    }
    Ma fonction est censé prendre une String et la convertir :
    Exemple attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $StringEntree = "Il était une fois @ l'ouest";
    $StringSortie = "Il-etait-une-fois-a-louest";
    Hors le problème c'est que j'obtiens : 'Il-eetait-une-fois-a-louest'

    J'obtiens un doublement des e

    Et par exemple si je passe 'für' j'obtiens : 'feur'... au lieu de 'fur' !

    Bizarre...

    Et quand je modifie $replace = array ('e','a','i','u','o','c','-',''); en $replace = array ('','a','i','u','o','c','-',''); je n'ai plus le doublement des e, mais j'ai pu de e à la place des éèëê...

    Une idée ??

    Merci d'avance, là je ne vois pas...

    Cordialement,

    Thec

  2. #2
    Membre expérimenté
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Salut,

    ton fichier .php est sans doute encodé en utf8, encode le en latin-1 et essaye, chez moi ca marche.

  3. #3
    Membre confirmé Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Par défaut
    Ah ouai.. Le problème c'est que tout le projet est en utf-8... Si je mets mon fichier qui comporte ma fonction en Iso, je n'ai plus le problème avec le doublement de e, mais je n'ai plus de e du tout...

    Une solution ?

  4. #4
    Membre expérimenté
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    ben PHP ne supporte pas encore l'unicode, c'est pour la version 6 !

    mais il y a des solutions !

    Les fonctions utf8_decode et utf8_encode, présentes par défaut, n'ont pas l'air de faire l'affaire.

    Il me semble bien qu'il faille passer par une librairie, c'est a dire iconv, qui permet de convertir les chaines de caractères.

    http://fr.php.net/manual/fr/function.iconv.php

  5. #5
    Membre confirmé Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Par défaut
    Ok, merci... Je vais regarder de ce côté et je reviendrai vous tenir au courant

    Merci pour la piste !

    Cdlmt,

    Thec

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    héhé, encore une occasion de placer ma fonction de nettoyage des accents...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
    function NomToCodeUrl($in) {
        $in = remove_accents($in);
        $search = array ('@[éèêëÊË]@i','@[àâäÂÄ\@]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_-]@');
        $replace = array ('e','a','i','u','o','c','-','');
        //la fonction rtrim supprime les espaces en fin de chaine
        return rtrim(preg_replace($search, $replace, $in));
    }
     
    function remove_accents($str, $charset='utf-8') {
     
        $str = htmlentities($str, ENT_NOQUOTES, $charset);
     
        $str = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
        $str = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $str); // pour les ligatures e.g. '&oelig;'
        $str = preg_replace('#\&[^;]+\;#', '', $str); // supprime les autres caractères
     
        return $str;
    }
     
    $StringEntree = "Il était une fois @ l'ouest";
    $StringSortie = "Il-etait-une-fois-a-louest";
     
    print NomToCodeUrl($StringEntree);

  7. #7
    Membre confirmé Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Par défaut
    Bon bin j'aurais même pas eu le temps d'aller voir

    Ca marche parfaitement !!

    Merci à tous, et à s.n.a.f.u... La solution est propre rapide et efficace !

    Bonne fin de semaine, c'est résolu^^

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Au passage, tu peux simplifier ta fonction puisque les accents sont déjà gérés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function NomToCodeUrl($in) {
        $in = remove_accents($in);
        $search = array ('/[ç]/i','/[ ]/i','/[@]/i','/[^a-zA-Z0-9_-]/');
        $replace = array ('c','-','a','');
        //la fonction rtrim supprime les espaces en fin de chaine
        return rtrim(preg_replace($search, $replace, $in));
    }

  9. #9
    Membre confirmé Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Par défaut
    Super !

    Edit: Parfait !!

  10. #10
    Membre expérimenté
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Apres quelques recherches sur Google d'une solution au probleme des accents, voici les deux les plus populaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function normalize ($string) {
        $table = array(
            'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
            'À'=>'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', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
            'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',
        );
     
        return strtr($string, $table);
    }
    L'idee est de ne pas faire appel inutilement a des fonctions de la famille PCRE qui sont des gouffres en ressource.

    Et pour une solution encore plus propre afin de faire disparaitre les accents mais qui marche pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text)
    Le paramètre TRANSLIT est sensé faire sauter les accents mais chez moi il affiche le caractère et l'accent cote a cote.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2009, 09h04
  2. Référencement de mon site : disparu des résultats
    Par zimage dans le forum Référencement
    Réponses: 1
    Dernier message: 21/02/2009, 12h45
  3. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  4. mon projet a des erreurs please help :)
    Par babemagus dans le forum MFC
    Réponses: 5
    Dernier message: 15/06/2005, 13h40
  5. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo