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 et double tableau [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut preg_match_all et double tableau
    Bonjour,

    J'ai parcouru l'aide pour la fonction preg_match_all.

    Mais bien entendu, quelque chose m'échappe.

    A priori, on peut récupérer un tableau contenant toutes les occurences d'un phrase en fonction du masque.

    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	$texte="Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais";
    preg_match_all('¤\[[^\]]*\]¤i', $texte, $masque);
    print_r($masque);
    Donc on peut récupérer deux tableaux via $masque[0] et via $masque[1].
    Mais je n'ai un retour que pour $masque[0] qui contient un tableau contenant les mots entre crochets : test, veux, aaa

    $masque[1] est vide ! Ne devrait-il pas retourner les mots : 'ceci est un ', car je, parce que je le dis et, parce que je le fais

    Pouvez-vous m'éclairer
    Merci

  2. #2
    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
    Un petit exemple pour expliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $str = "Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais";
     
    preg_match_all('#\[([^\]]*)\]#i', $str, $m);
     
    print_r($m);
    Les indices à partir de 1 correspondent aux captures de l'expression.

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    MErci pour ta réponse.

    Je me rends compte que cela ne m'amènera pas au résultat escompté !

    La fonction preg_grep semble la plus approprié mais je ne parviens pas à l'utiliser correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $str = "Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais";
     
    $tex = preg_grep('¤\[([^\]]*)\]¤i', $str, 0);
     	print_r($tex);
    J'ai simplement Array sans contenu ?? pourquoi ?

  4. #4
    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 bastien Voir le message
    Je me rends compte que cela ne m'amènera pas au résultat escompté !
    Quel est le résultat escompté ?

    Au pif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $str = "Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais";
     
    $m = preg_split('/\s*\[|\]\s*/', $str);
     
    print_r($m);

  5. #5
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    En fait, je cherche à récupérer dans deux tableaux différents, les mots entre les crochets et le texte entre deux []

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array([0]=>'test', [1]=>'veux', [2]=>'aaa')
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array([0]=>'Ceci est un ', [1]=>'car je', [2]=>'parce que je le dis et ', [3]=>' parce que je le fais')

    en fait, preg_grep me plaisait bien mais je n'arrive pas à le faire fonctionner !

  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 : 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
    Ce serait plus simple en plusieurs passes, mais pour la beauté du geste, je peux tenter ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $str = "Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais";
     
    $reg = '#\s* ([^[]+) \s* (\[[^]]+\])? \s*#x';
     
    preg_match_all($reg, $str, $m);
     
    print_r($m);

  7. #7
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    JE m'incline !

    C'est beau !

    Mais néanmoins, peux-tu perdre 2 minutes pour m'expliquer ?
    Avoir une réponse c'est bien, mais la comprendre, c'est mieux !

    Et pour quelle raison preg_grep ne fonctionne-t-il pas?

  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 : 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
    Bah nan, c'est pas si beau...
    Je la regarde avec un oeil plus reposé, et l'erreur apparait flagrante : avec cette chaîne par exemple, ça foire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = "[first]Ceci est un [test] car je [veux] parce que je le dis et [aaa] parce que je le fais[last]";
    A vue de nez, je dirais que celle-là va mieux marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#\s* ([^[]+) \s* | \s* (\[[^]]+\]) \s*#x';
    Et preg_grep est fait pour parcourir un tableau, donc pas adapté à notre cas.

  9. #9
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    Voici donc le résultat (fort agréable d'ailleurs !)
    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
    Array
    (
        [0] => Array
            (
                [0] => [first]
                [1] => Ceci est un 
                [2] => [test] 
                [3] => car je 
                [4] => [veux] 
                [5] => parce que je le dis et 
                [6] => [aaa] 
                [7] => parce que je le fais
                [8] => [last]
            )
     
        [1] => Array
            (
                [0] => 
                [1] => Ceci est un 
                [2] => 
                [3] => car je 
                [4] => 
                [5] => parce que je le dis et 
                [6] => 
                [7] => parce que je le fais
                [8] => 
            )
     
        [2] => Array
            (
                [0] => [first]
                [1] => 
                [2] => [test]
                [3] => 
                [4] => [veux]
                [5] => 
                [6] => [aaa]
                [7] => 
                [8] => [last]
            )
     
    )
    Mais néanmoins, je reste sur ma faim !

    Peux-tu me corriger si je me trompe?
    L'expression permet de récupérer successivement du texte sans crochet et le texte avec crochet immédiatement après. et ainsi de suite ... Mais pourquoi first est indexé en 0? Il devrait être indexé en 1 car en 0, la valeur devrait être nulle, non?

    ET pourquoi 3 lignes de résultats, je ne m'attendai qu'aux deux derniers !

  10. #10
    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 bastien Voir le message
    L'expression permet de récupérer successivement du texte sans crochet et le texte avec crochet immédiatement après. et ainsi de suite ...
    Ca c'est le fonctionnement du premier motif que j'ai donné et que tu as correctement interprété.
    Mais pourquoi first est indexé en 0? Il devrait être indexé en 1 car en 0, la valeur devrait être nulle, non?
    Le deuxième motif récupère un texte sans crochet OU avec crochet. D'où la présence de "first" dans la première capture. Et c'est aussi pour cela que le premier motif ne marchait pas.

    ET pourquoi 3 lignes de résultats, je ne m'attendai qu'aux deux derniers !
    Le premier tableau correspond au texte qui correspond entièrement au motif, sans capture.

  11. #11
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    Je te remercie

    C'est vraiment sympa

    Tu m'as permis de faire un bond dans lacompréhension des expressions régulières.

    A bientot

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

Discussions similaires

  1. Déclarer des variables ou un double tableau dynamiquement
    Par calimerojeff dans le forum Langage
    Réponses: 1
    Dernier message: 20/08/2009, 10h21
  2. passage par parametre d'un double tableau
    Par nakac dans le forum C
    Réponses: 2
    Dernier message: 21/12/2008, 04h27
  3. public static []tableau (double []tableau) ?
    Par rXpCH dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 29/02/2008, 09h34
  4. Réponses: 1
    Dernier message: 27/04/2007, 14h56
  5. retourner un double tableau
    Par miminou dans le forum C++
    Réponses: 12
    Dernier message: 09/12/2005, 11h25

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