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

  1. #1
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    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 émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    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 actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    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 régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    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 régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    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) ;

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,



    J’aimerais savoir quelle(s) sorte(s) de chaîne(s) sont données comme argument(s) à ta fonction dans ton premier post car les résultats du code sont:



    - qu'effectivement si $City_ZIP = "76200 Dieppe" ; comme dans le second code dans ton premier post, on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $City_ZIP : 76200 Dieppe Array ( [0] => 76200 Dieppe [1] => Dieppe )



    - mais que pour obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $City_ZIP : 95124 Ermont Array ( [0] => 95124 Ermont [1] => 95124 Ermont )
    il faut avoir $City_ZIP = ' 95124 Ermont ';

    c’est a dire avec un blanc en tête, comme c’est ce que tu sembles avoir indiqué dans

    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 
    )


    Mais avec un blanc devant, c’est justement ce que propose snafu: est-ce pour mettre en evidence la cause du problème ou est-ce à titre de solution ? : je ne comprends pas.



    Donc j’ai déjà besoin de savoir quelles sont les conditions dans lesquelles ça ne marche pas pour une exécution en réel, ce qui n’est pas dit dans ton premier post, on n’a pas la valeur de $City_ZIP







    En outre, il y a
    preg_match(_all)
    dans ton premier post.

    Est-ce preg_match() ou preg_match_all() que tu utilises et qui donne le résultat inattendu ?

  9. #9
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Mais avec un blanc devant, c’est justement ce que propose snafu: est-ce pour mettre en evidence la cause du problème ou est-ce à titre de solution ? : je ne comprends pas.
    Reponse 1, Jean-Pierre : "mettre en evidence la cause du problème"


  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    aah ! je n’avais pas vu la réponse de snafu. À force de traîner à faire plusieurs choses à la fois......

    Donc le blanc dans ta réponse, snafu, c’est pour indiquer la source du problème.



    Plus généralement, il n’y a pas qu’un blanc qui provoque cela.

    Le code suivant donne à penser que tant qu’il y a des caractères non-chiffres devant le code postal, le résultat sort avec au moins une partie de ces caractères non chiffres préalables.

    Si la chaîne commence par des chiffres qui ne sont pas le code postal, le groupe 1 contient quand même les caractères non-chiffres à partir du premier non-chiffres qui suit les premiers chiffres

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?php
     
    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] ;
    }
    $City_ZIP = '76200 Dieppe'; 
    extraireCity ($City_ZIP);
     
    echo '<br /><br />';
    $City_ZIP = ' 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '-->95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = 'Code95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = 'Code 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = ':95124 Ermont  ';
    extraireCity ($City_ZIP);
     
    echo '<br /><br />';
    $City_ZIP = '422 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '422-->95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '422Code95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '422Code 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '422:95124 Ermont  ';
    extraireCity ($City_ZIP);
     
    echo '<br /><br />';
    $City_ZIP = '  4 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '--8-->95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = 'Co9de95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = 'Co9de 95124 Ermont  ';
    extraireCity ($City_ZIP);
    echo '<br />';
    $City_ZIP = '::77::95124 Ermont  ';
    extraireCity ($City_ZIP);
    ?>
    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
    $City_ZIP : 76200 Dieppe Array ( [0] => 76200 Dieppe [1] => Dieppe ) 
     
    $City_ZIP : 95124 Ermont Array ( [0] => 95124 Ermont [1] => 95124 Ermont ) 
    $City_ZIP : -->95124 Ermont Array ( [0] => -->95124 Ermont [1] => -->95124 Ermont ) 
    $City_ZIP : Code95124 Ermont Array ( [0] => Code95124 Ermont [1] => Code95124 Ermont ) 
    $City_ZIP : Code 95124 Ermont Array ( [0] => Code 95124 Ermont [1] => Code 95124 Ermont ) 
    $City_ZIP : :95124 Ermont Array ( [0] => :95124 Ermont [1] => :95124 Ermont ) 
     
    $City_ZIP : 422 95124 Ermont Array ( [0] => 422 95124 Ermont [1] => 95124 Ermont ) 
    $City_ZIP : 422-->95124 Ermont Array ( [0] => 422-->95124 Ermont [1] => -->95124 Ermont ) 
    $City_ZIP : 422Code95124 Ermont Array ( [0] => 422Code95124 Ermont [1] => Code95124 Ermont ) 
    $City_ZIP : 422Code 95124 Ermont Array ( [0] => 422Code 95124 Ermont [1] => Code 95124 Ermont ) 
    $City_ZIP : 422:95124 Ermont Array ( [0] => 422:95124 Ermont [1] => :95124 Ermont ) 
     
    $City_ZIP : 4 95124 Ermont Array ( [0] => 4 95124 Ermont [1] => 4 95124 Ermont ) 
    $City_ZIP : --8-->95124 Ermont Array ( [0] => --8-->95124 Ermont [1] => --8-->95124 Ermont ) 
    $City_ZIP : Co9de95124 Ermont Array ( [0] => Co9de95124 Ermont [1] => Co9de95124 Ermont ) 
    $City_ZIP : Co9de 95124 Ermont Array ( [0] => Co9de 95124 Ermont [1] => Co9de 95124 Ermont ) 
    $City_ZIP : ::77::95124 Ermont Array ( [0] => ::77::95124 Ermont [1] => ::77::95124 Ermont )

    Et l'explication, quelle est-elle ?
    J'attends la reponse a mon precedent post



    PS
    Je viens de voir la 2ième réponse de snafu à mon post qui n’avait pas vu sa 1ère. Eh Lucky Luke, tu dégaines trop vite !

  11. #11
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Ok merci à vous tous, j'ai ajouter un petit trim () et ça marche.

    Pour l'explication je pense que j'ai compris :

    pour la chaine "toto76200 Dieppe"

    la regex se déroule de la manière suivante :
    \d* le t ne match pas, donc on passe à la suite de la regex
    .* match pour toute la chaine : c'est fini.

    Effectivement si j'avais mis \d+ ça aurait mieux marché, par contre j'aurais eu des problèmes avec les noms de ville sans code postal...


    Merci beaucoup : ça m'a bien débloqué.

    ++Florent.

+ 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