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 actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    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 : 479
    Points : 281
    Points
    281
    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 seule chaîne (et non pas autant de chaînes que de lignes).

    Code : Sélectionner 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 tableau les valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tableau[0] : 15
    $tableau[1] : 8,00
    $tableau[2] : 2,60
    $tableau[3] : 13
    $tableau[4] : 1,80
    $tableau[5] : 11
    $tableau[6] : 2,00
    J'ai testé une expression régulière :
    Code : Sélectionner 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}$
    Elle récupère bien les valeurs souhaitées.

    Mais quand j'utilise :
    Code : Sélectionner 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, $tableau, PREG_SET_ORDER);
    et bien, je n'ai rien dans $tableau !

  2. #2
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Pourquoi utiliser les ancres alors ? Surtout $ puisque la fin de la ligne ne se termine pas forcément par votre nombre mais par €. De plus, pour que les ancres ne soient plus globales (début et fin de chaîne) mais fonctionnent par rapport aux lignes, il faut ajouter le modificateur m au motif.

    Code : Sélectionner 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électionner 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 actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    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 : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par julp Voir le message
    Pourquoi utiliser les 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 les ancres ne soient plus globales (début et fin de chaînes) mais fonctionnent par rapport aux lignes, il faut ajouter le 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
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Vous pouvez consommer les 0 via l'expression régulière comme les traiter après (ltrim sur '0'). Genre :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    ~^0*([1-9]\d*(?:,\d{2})?)~m
    Par contre, ça introduit une capture (donc il faut aller chercher la correspondance à l'indice 1 et non plus 0) et le cas des nombres décimaux inférieurs à 1 (0,XX) n'est pas traité (avec une alternative probablement : ~^0*((?:[1-9]\d*|0)(?:,\d{2})?)~m).

  5. #5
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    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 : 479
    Points : 281
    Points
    281
    Par défaut
    Je précise.

    Avec :
    Code : Sélectionner 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électionner 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
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Oui. Qu'est-ce qui ne va pas ? Trop "large" ?

    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
    $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électionner 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 actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    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 : 479
    Points : 281
    Points
    281
    Par défaut
    Merci pour ces réponses.
    En fait, pour simplifier le code, je fais deux extractions :

    Code : Sélectionner 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 le 0, car je me suis aperçu que dans la base de données, le stockage prend un entier, donc le 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 les tests sous windows, $nombre est rempli correctement;
    quand c'est sous linux ubuntu, $nombre est vide !

    J'ai essayé sous linux avec :
    Code : Sélectionner 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 les éléments dans $nombre.

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

  8. #8
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    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 : 479
    Points : 281
    Points
    281
    Par défaut
    A la lecture 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 le 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 les 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 le 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