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 :

Récupérer toutes les occurences


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Par défaut Récupérer toutes les occurences
    Bonjour,
    Alors voila je cherche à créer un PARSER style BB mais qui convertirais un code vers du php.
    Pour le moment je calle sur la declaration des variables.
    En gros, j'ai un text :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE var1,var2,var3;
    J'aimerais récuperer var1 var2 var3

    J'utilise pour cela une expression réguliére et preg_match.
    Le probléme est que la variable de retour de preg_match ne contient que la derniere occurence, à savoir var3.

    Voila je met le code de mon appli :

    La RegEx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $this->varregex = '[a-z]\w*';    // 1_alpha some_alphanum atleast1_space 
    $this->declareregex =
    '/'.                // delimiter /
    '^\s*declare\s+'.        // some_spaces 1_"DECLARE" atleast1_space    
    "(?:($this->varregex)\s*,\s*)*".// atleast1_varregex(captured) some_space comma some_space
    "(?:($this->varregex)\s*\s*)$".    // must end with a var declaration without a comma 
    '/i';                // delimiter / + case insensitive option


    View :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    echo("<h3>Code : </h3>");
    $code = $this->input->post('code');
    echo($code);
    echo('<br>');
    $lines = explode(';',$code,-1);
    echo("<h3>Lines : </h3>");
    print_r($lines);
    echo("<br><h3>Validate : </h3><hr><hr>");
    foreach ($lines as $line )
    {
     
         $this->simplescript->Validateline($line);        
    }
    Test :
    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
     
    $t;
    $i = preg_match($this->declareregex,$line,$t);
    echo("<b>RegEx : </b>$this->declareregex<br>");
    echo("<b>Line : </b><font color='blue'>/</font>$line<font color='blue'>/</font>");
    if ($i)
    {
         echo ( '<font color="green"> (Valide) </font>');
    }
    else
    {
         echo ( '<font color="red"> (Not Valide) </font>');
    }    
    echo('<br>');
    print_r($t);
    echo('<br>');
    echo('<hr>');
    echo('<br>');
    return $i;

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Par défaut
    Et voila le resultat du script (C'est un fichier pure html, ni JS ni aucun script d'aucune sorte) :

    convert.htm

    Comme vous pouvez le voir, pour la phrase :

    DECLARE how, are, you
    Le tableau renvoyé par la fonction est

    Array ( [0] => DECLARE how, are, you [1] => are [2] => you )

    L'élement 0 :
    montre que la regex à bien reconnu l'ensemble de la phrase.
    L'élement 1 : devrait retourner how et are mais il ne retourne que are
    L'élement 2 : retourne la derniére parenthese qui à toujours une seule valeur.


    Merci
    Ps1: Désolé pour le double post mais je pense que c'est plus lisible ainsi.
    Ps2: Vu que ce n'est qu'un parser, l'utilisation de preg_replace ou des fonctions callback devrait resoude le probleme, mais j'aimerais bien savoir si il'y a une solution utilisant preg_match.

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    preg_match_all
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Par défaut
    Non, je crois qu'on s'est mal compris.
    preg_match_all retourne toutes les occurences qui sont compatible avec la RegEx.
    Moi je veux avoir toutes les valeur récuperé par des parentheses
    capturante pour une seule occurence.

    Exmple simple :
    Regex : (?:(\w*)\s?)+. // liste de mots separé par des espace et qui fini par un point.

    salut les terriens.
    salut les terriens.

    preg_match_all va retourner

    "salut les terriens."
    "salut les terriens."

    alors que ce que moi je veux recuperer c'est "salut" "les" "terriens".

    Je pose la question autrement :

    Quelle RegEx utilisé pour trouver la syntaxe de declaration PHP (sans initialisation), sachant que je veux récupérer le nom des variables.

    Ex: var $salut, $comment, $ca , $va;

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    fais un var dump de tes matches tu verras que ta capture de parenthèses est dedans :

    sinon tu peux aussi nommer ton groupe pour le recupérer plsu facilement

    et regarde ce que tu obtiens dans
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Par défaut
    Toujours pas.

    Voila pour reg_match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RegEx : /(?:(\w+)\s?)+./i
    Line : /salut les terriens./ (Valide)
    Var_Dump : array(2) { [0]=> string(19) "salut les terriens." [1]=> string(8) "terriens" }
    Print_R : Array ( [0] => salut les terriens. [1] => terriens )
    et pour reg_match_all :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    RegEx : /(?:(\w+)\s?)+./i
    Line : / salut les terriens./ (Valide)
    Var_Dump : array(2) { [0]=> array(1) { [0]=> string(19) "salut les terriens." } [1]=> array(1) { [0]=> string(8) "terriens" } }
    Print_R : Array ( [0] => Array ( [0] => salut les terriens. ) [1] => Array ( [0] => terriens ) )
    En utilisant les parentheses nomme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RegEx : /(?:(?P<elt>\w+)\s?)+./i
    Line : /salut les terriens./ (Valide)
    Var_Dump : array(3) { [0]=> array(1) { [0]=> string(19) "salut les terriens." } ["elt"]=> array(1) { [0]=> string(8) "terriens" } [1]=> array(1) { [0]=> string(8) "terriens" } }
    Print_R :Array ( [0] => Array ( [0] => salut les terriens. ) [elt] => Array ( [0] => terriens ) [1] => Array ( [0] => terriens ) )

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $chaine="salut les terriens.";
    $reg="#(?P<mot>\w+)#";
    preg_match_all($reg,$chaine,$tabChaine);
    var_dump($tabChaine['mot']);
    en fait il n'y pas besoin de mettre les espaces masi si tu y tiens tu peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg="#\s?(?P<mot>\w+)\s?#";
    Une autre façon de procéder plsu simple serait de faire un split sur \W
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

Discussions similaires

  1. Récupérer toutes les occurences d'un clip
    Par threaded dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 30/04/2010, 12h52
  2. [RegEx] Récupérer ce qu'il y a entre deux chaines (toute les occurences)
    Par greg1107 dans le forum Langage
    Réponses: 3
    Dernier message: 23/01/2008, 15h48
  3. Récupérer toutes les occurences d'une regex ?
    Par ViRouF dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 26/01/2007, 11h40
  4. [RegEx] Regex : récupérer toutes les occurences dans une chaîne
    Par Poulpynette dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2006, 11h14
  5. Récupérer toutes les cases à cocher
    Par psyco2604 dans le forum ASP
    Réponses: 7
    Dernier message: 14/10/2004, 11h54

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