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_all ne reconnait pas ma regexp [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut preg_match_all ne reconnait pas ma regexp
    Bonjour,

    Je dois extraire des données d'une chaîne de caractères.
    La chaîne apparaît sur plusieurs lignes, mais c'est bien une seu chaîne (et non pas autant de chaînes que de lignes).

    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    15
    8,00€
    2,60€
    13
    1,80€
    11
    2,00€

    Je voudrais récupérer dans un tabau s vaurs :

    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tabau[0] : 15
    $tabau[1] : 8,00
    $tabau[2] : 2,60
    $tabau[3] : 13
    $tabau[4] : 1,80
    $tabau[5] : 11
    $tabau[6] : 2,00
    J'ai testé une expression régulière :
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ^(\d{1,9},\d{2})|^(20|1[0-9]{1}|[1-9]{1})$|[1-9]{1}$
    El récupère bien s vaurs souhaitées.

    Mais quand j'utilise :
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all("/^(\d{1,9},\d{2})|^(20|1[0-9]{1}|[0-9]{1})$|[0-9]{1}$/", $chaine, $tabau, PREG_SET_ORDER);
    et bien, je n'ai rien dans $tabau !

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Pourquoi utiliser s ancres alors ? Surtout $ puisque la fin de la ligne ne se termine pas forcément par votre nombre mais par €. De plus, pour que s ancres ne soient plus globas (début et fin de chaîne) mais fonctionnent par rapport aux lignes, il faut ajouter modificateur m au motif.

    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $in = <<<EOT
    15
    8,00&euro;
    2,60&euro;
    13
    1,80&euro;
    11
    2,00&euro;
    EOT;
     
    if (preg_match_all('~^\d+(?:,\d{2})?~m', $in, $matches)) {
        var_dump($matches);
    }
    Code X : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Array
    (
        [0] => Array
            (
                [0] => 15
                [1] => 8,00
                [2] => 2,60
                [3] => 13
                [4] => 1,80
                [5] => 11
                [6] => 2,00
            )
    )

  3. #3
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut
    Citation Envoyé par julp Voir  message
    Pourquoi utiliser s ancres alors ? Surtout $ puisque la fin de la ligne ne se termine pas forcément par votre nombre mais par &euro;. De plus, pour que s ancres ne soient plus globas (début et fin de chaînes) mais fonctionnent par rapport aux lignes, il faut ajouter modificateur m au motif.
    )[/code]
    En plus, j'ai bien précisé que c'est une chaîne et pas autant de chaînes que de lignes...Bon, on va dire que j'étais mal réveillé...

    Par contre, en testant votre expression sous Regexbuddy, ça marche pas

    Heureusement, preg_match_all accepte.

    Dans ma chaîne de caractères, il peut y avoir aussi 01, 02... et je veux dans ce cas récupérer 1, 2...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Vous pouvez consommer s 0 via l'expression régulière comme s traiter après (ltrim sur '0'). Genre :
    Code X : Séctionner tout - Visualiser dans une fenêtre à part
    ~^0*([1-9]\d*(?:,\d{2})?)~m
    Par contre, ça introduit une capture (donc il faut alr chercher la correspondance à l'indice 1 et non plus 0) et cas des nombres décimaux inférieurs à 1 (0,XX) n'est pas traité (avec une alternative probabment : ~^0*((?:[1-9]\d*|0)(?:,\d{2})?)~m).

  5. #5
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut
    Je précise.

    Avec :
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    15
    8,00&euro;
    2,60&euro;
    13
    1,80&euro;
    11
    2,00&euro;
    01
    08
    Je veux récupérer :

    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    15
    8,00
    2,60
    13
    1,80
    11
    2,00
    1
    8

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Oui. Qu'est-ce qui ne va pas ? Trop "large" ?

    Code : Séctionner 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
    $in = <<<EOT
    15
    8,00&euro;
    2,60&euro;
    13
    1,80&euro;
    11
    2,00&euro;
    01
    08 &euro;
    000000100000
    000450,00&euro;
    0000,94
    EOT;
     
    if (preg_match_all('~^0*((?:[1-9]\d*|0)(?:,\d{2})?)~m', $in, $matches)) {
        print_r(array_pop($matches));
    }
    Code X : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Array
    (
        [0] => 15
        [1] => 8,00
        [2] => 2,60
        [3] => 13
        [4] => 1,80
        [5] => 11
        [6] => 2,00
        [7] => 1
        [8] => 8
        [9] => 100000
        [10] => 450,00
        [11] => 0,94
    )

  7. #7
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut
    Merci pour ces réponses.
    En fait, pour simplifier code, je fais deux extractions :

    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    preg_match_all("~^\d+$~m", $liste, $nombre, PREG_PATTERN_ORDER);
    preg_match_all("~^\d+,\d{2}~m", $liste, $montant, PREG_PATTERN_ORDER);
    Je récupère donc pour nombre :
    15
    13
    11
    01
    08
    (je garde 0, car je me suis aperçu que dans la base de données, stockage prend un entier, donc 0 est ignoré automatiquement par la base de données)

    et pour montant :
    8,00
    2,60
    1,80
    2,00


    Par contre, y a quelque chose de bizarre :
    quand je fais s tests sous windows, $nombre est rempli correctement;
    quand c'est sous linux ubuntu, $nombre est vide !

    J'ai essayé sous linux avec :
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match_all("~^\d+,\d{2}~m", $liste, $nombre, PREG_PATTERN_ORDER);
    et j'ai bien tous s éléments dans $nombre.

    Une idée pourquoi la première regex (~^\d+$~m) ne passe pas sous linux ?

  8. #8
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut
    A la cture des réponses, la solution a été trouvée.

    Je ferme la discussion.

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

Discussions similaires

  1. ma page ne reconnait pas la classe dans css
    Par Dnx dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 25/08/2005, 23h57
  2. [Debutant(e)]StreamTokenizer: ne reconnait pas s floats!!
    Par doudine dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 10/12/2004, 17h28
  3. [HARDWARE] Graveur DVD ne reconnait pas des DVD
    Par Yepazix dans le forum Périphériques
    Réponses: 2
    Dernier message: 30/11/2004, 15h22
  4. Installation : ne reconnait pas CDROM
    Par SebCBien dans le forum Matériel
    Réponses: 4
    Dernier message: 08/08/2004, 17h10
  5. Réponses: 4
    Dernier message: 24/03/2004, 12h37

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