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 :

preg_match : comportement variable [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut preg_match : comportement variable
    Bonjour,

    j'ai un comportement très étrange de la fonction preg_match(_all).

    Dans mon scripte j'ai la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function extraireCity ($City_ZIP)
    {
        print "\$City_ZIP : $City_ZIP\n" ;
        preg_match ("#\d*(.*)#", $City_ZIP, $tab_tmp) ;
        print_r ($tab_tmp) ;
        return @$tab_tmp[1] ;
    }
    Elle est censée extraire la ville en ignorant le code postale...
    Or elle affiche ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $City_ZIP :  95124 Ermont 
    Array
    (
        [0] =>  95124 Ermont 
        [1] =>  95124 Ermont 
    )
    Par contre si j'exécute le code de test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
        $City_ZIP = "76200 Dieppe" ;
        print "\$City_ZIP : $City_ZIP\n" ;
        preg_match ("#\d*(.*)#", $City_ZIP, $tab_tmp) ;
        print_r ($tab_tmp) ;
        return @$tab_tmp[1] ;
    ?>
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $City_ZIP : 76200 Dieppe
    Array
    (
        [0] => 76200 Dieppe
        [1] =>  Dieppe
    )
    J'ai trituré le code dans tous les sens et j'obtiens toujours la même chose : un scripte de test qui marche et mon scripte qui ne marche pas...


    Je ne comprends pas bien, si quelqu'un avait une idée...

    ++Florent.

  2. #2
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut
    Il faut peut-être remplacer les guillements par des apostrophes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match ('#\d*(.*)#', $City_ZIP, $tab_tmp);
    ou bien, essaie ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('/[0-9]+ (.+)$/', $City_ZIP, $tab_tmp);

  3. #3
    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
    C'est plus simple et pourtant plus sournois.

    Essaies ce code qui devrait éclairer ta route :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
        $City_ZIP = " 76200 Dieppe" ;
        print "\$City_ZIP : $City_ZIP\n" ;
        preg_match ("#\d*(.*)#", $City_ZIP, $tab_tmp) ;
        print_r ($tab_tmp) ;
        return @$tab_tmp[1] ;

  4. #4
    Membre éclairé Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Par défaut
    D'où l'intérêt d'éviter le plus souvent possible d'utiliser le point, qui est parfois trop gourmand. En fait, c'est surtout dû au fait que tu le couples avec le quantificateur *.

    s.n.a.f.u a très bien résumé le problème : la partie \d* étant facultatif et ton pattern n'étant pas particulièrement clair, lorsque d'autres caractères se trouvent devant ta chaîne, ça ne retourne pas le résultat escompté...

    À priori, une ville ne pouvant pas contenir de chiffres, tu devrais plutôt utiliser une classe un peu moins gourmande ([a-z-] par exemple). Et puisqu'il semble nécessaire que tu aies le code postal ET la ville dans ta chaîne, évite * et utilise plutôt +.

  5. #5
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Bonjour,

    merci à tous pour vos réponses.
    Je voudrais précisé que j'ai beaucoup de chaines à traiter, certaines avec le code postale d'autres sans. D'où l'étoile.
    Sinon je ne comprends pas ta réponse s.n.a.f.u : tu me propose de mettre un espace devant ma chaine à matcher ?

    Moi ce qui me perturbe c'est que mon code marche très bien dans un petit script de test et dès que je l'intègre à mon script principale le résultat diffère... C'est embêtant tout de même : ça veut dire que la fonction preg_match est sujette à un effet de bord.

    ++Florent.

  6. #6
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Bon, j'ai compris où il y avait une différence.

    Si dans mon script principal j'écrase ma chaine par "76200 Dieppe" ça marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function extraireCity ($City_ZIP)
    {
        print "\$City_ZIP : $City_ZIP\n" ;
        $City_ZIP = "76200 Dieppe" ;
        preg_match ("#\d*(.*)#", $City_ZIP, $tab_tmp) ;
        print_r ($tab_tmp) ;
        return @$tab_tmp[1] ;
    }
    Bon le problème c'est que j'écrase ma chaine à matcher

    Ça doit être un problème d'encoding ou un truc dans se genre car mes chaine viennent d'un fichier excel. Ce qui est curieux c'est que toutes mes autre regex marchent très bien...

    Si vous avez une idée...

    ++Florent.

  7. #7
    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
    Citation Envoyé par floanne Voir le message
    Sinon je ne comprends pas ta réponse s.n.a.f.u : tu me propose de mettre un espace devant ma chaine à matcher ?
    Non, c'est le contraire : je voulais mettre en avant le fait que c'était l'espace devant qui mettait la grouille.
    Je te conseillerai donc de restreindre un peu ton motif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        preg_match ("#\d+ (\w+)#", $City_ZIP, $tab_tmp) ;

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

Discussions similaires

  1. [XL-2007] Comportement variable d'une DLL maison.
    Par zoom* dans le forum Excel
    Réponses: 1
    Dernier message: 28/03/2013, 18h55
  2. Réponses: 3
    Dernier message: 30/10/2010, 10h49
  3. Réponses: 1
    Dernier message: 25/07/2006, 15h52
  4. Comportement bizarre de variables d'applications
    Par ahage4x4 dans le forum ASP
    Réponses: 2
    Dernier message: 14/11/2005, 11h51
  5. [langage] Comportement étrange d'une variable
    Par Spaz dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2004, 11h29

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