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 :

Capture multiple : ne renvoie que la dernière valeur


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Capture multiple : ne renvoie que la dernière valeur
    Bonjour,

    Je suis nouveau sur ce forum, et je viens poster ici suite à l'excellent article sur les expressions rationnelles.

    Mon problème est le suivant :
    Soit une chaine de caractères dans laquelle je souhaite extraire les paires de caractères situées après un nombre déterminé, et avant le nombre suivant.

    Le code que j'emploie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $chaine = "8aa,bb_6af,aw,bb,aj_3ai_2";
    $motif = "#6([a-z]{2})(?:,([a-z]{2}))*#";
    preg_match_all($motif,$chaine,$resultat,PREG_SET_ORDER);
     
    echo "<pre>";
    print_r($resultat);
    echo "</pre>";
    Le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array
    (
        [0] => Array
            (
                [0] => 6af,aw,bb,aj
                [1] => af
                [2] => aj
            )
     
    )
    Je n'arrive pas à obtenir les paires aw et bb. Merci de m'expliquer ce qui cloche, plus qu'un bug ou qu'une erreur de frappe, j'ai l'impression de passer à côté d'un principe de fonctionnement des regex, et ça sera un réel soulagement quand je saurais ce que c'est !
    Je sais que je peux y arriver autrement, avec explode par exemple, mais vous l'aurez compris, j'aimerais comprendre

    (Ma version de php est : PHP Version 5.2.4-2ubuntu5.3)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chaine = "8aa,bb_6af,aw,bb,aj_3ai_2";
    $motif = "#6([a-z]{2})(?:,([a-z]{2}))*#";
    faut que tu ecrives tout le motif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $motif = "/6([a-z]{2}),([a-z]{2}),([a-z]{2})/";

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour monsieurjean,

    Merci de t'être penché sur mon problème. Ta solution est correcte, mais elle ne répond hélas pas à mes attentes. La chaîne que je donne est à titre d'exemple, elle prend en réalité des milliers de formes différentes, et je ne peux pas prédire à l'avance le nombre de paires de caractères présentes entre deux nombres.

    En l'état actuel, et après avoir continué mes recherches sur la question, je peux dire sans trop de risque que ça n'est pas possible en une seule expression.
    Je me suis donc rabattu sur la solution la plus élégante suivante, faire suivre ma première expression par un explode.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Je tombe egalement sur le meme probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /*en gros j'essaie de traiter des valeurs comme [(aaa=bbb;ddd=eee;;;abc=eee)toto()]*/
    	$inside1 = '([^\(\)\[\]]*)';
    	$inside2 = '([^\(\)\[\]]*)';
    	$pre = '\[\('.'([^\(\)\[\];]*=[^\(\)\[\];]*;*)*'.'\)';
    	$post = '\(\)\]';
    	Template::$it = $val;
    	$ret = preg_replace_callback('/'.$pre.toto.$post.'/', 'Template::preg', $ret);
    Ca entre bien dans ma fonction Template::preg, mais le tableau de matches ne contient que la derniere occurence de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '([^\(\)\[\];]*=[^\(\)\[\];]*;*)*'
    J'aimerais savoir s'il existe une syntaxe pour que le tableau remplisse bien toutes les occurence de type "a=b".

Discussions similaires

  1. [2.x] count symfony2 ma boucle n'affiche que la dernière valeur
    Par Medidev dans le forum Symfony
    Réponses: 1
    Dernier message: 31/03/2014, 17h33
  2. Fonction qui renvoie la dernière valeur d'une plage
    Par brunoSCP dans le forum Excel
    Réponses: 5
    Dernier message: 12/02/2010, 17h53
  3. Réponses: 9
    Dernier message: 20/08/2009, 14h33
  4. [RegEx] preg_match_all renvoie la dernière valeur
    Par thomas_pmbx dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2007, 22h28

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