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 de sous masques répétés à l'infini


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Capture de sous masques répétés à l'infini
    Bonsoir tout le monde

    J'ai une petite colle pour vous, amis balaises en expressions régulières...

    Nous avons un texte de cette forme :
    "$var1.var2"
    ou encore
    "$var1.var2.var3.var4"
    enfin le nombre de varN n'a pas de limite supérieure en théorie (mais au minimum il est de 1)

    Je recherche donc le masque de regexp qui me retournera un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $matches[1] = "var1";
    $matches[2] = "var2";
    $matches[3] = "var3";
    $matches[4] = "var4";
    ?>
    Voici le test (parmi tant d'autres) déja testé par moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    preg_match('#\$([a-zA-Z0-9_]+)(?:\.([a-zA-Z0-9_]+))*#', '$var1.var2.var3.var4', $matches);
     
    print_r($matches);
    ?>
    Le problème de ce masque (et des expressions régulières en générale) c'est que le sous-masque suivi de * ne capture que la dernière occurence et non pas toutes !
    Je me retrouve donc avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $matches[1] = "var1";
    $matches[2] = "var4";
    ?>
    Alors je vois déja venir les réponses du genre : "tu récupères 'var1.var2.var3.var4' et tu fais un explode à tous les points.

    Oui mais non ! Par souci purement scientifique je veux savoir comment on peut le faire en Regexp !

    J'ai essayé de m'intéresser aux sous-masques récursifs mais j'avoue que la doc PHP est plutôt obscure sur ce point.

    C'est pourquoi je fais appel à vos dons de programmeurs pour résoudre ce problème par défi.

    Merci beaucoup d'avance

  2. #2
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #(?:\$|\.)([A-Za-z0-9]+)+#
    ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    En fait les masques récursifs ne permettent pas ça. Voilà un exemple de masque récursif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('#[a-zA-Z0-9_]+(?>\.(?R)|)#', '$var1.var2.var3.var4', $matches);
    Ca reconnait quasiment ton langage, il manque le $ au début qu'on peut, rajouter peut être d'une manière ou d'une autre. Là, dans cet exemple simple, on chope un identificateur, et ensuite on regarde si y'a un point. Si y'en a un, on refait le test d'expression régulière récursivement, sinon, ça s'arrête là.

    Elles ne changent rien au problème parce que de toute façon, $matches n'aura toujours que la dernière valeur capturée par une parenthèse.

    En principe, la solution, c'est d'utiliser preg_match_all avec l'expression régulière de Korko Fain.

Discussions similaires

  1. Capturer des sous-chaînes avec regexec
    Par p.florent dans le forum Débuter
    Réponses: 2
    Dernier message: 10/08/2009, 00h34
  2. [AC-2003] Un sous formulaire répété
    Par asPierre dans le forum IHM
    Réponses: 2
    Dernier message: 24/05/2009, 21h23
  3. Capture video sous directX9
    Par raphchar dans le forum DirectX
    Réponses: 1
    Dernier message: 28/03/2009, 14h05
  4. Compilation C sous Visual Studio 2008 infiniment lente
    Par couturier dans le forum Visual Studio
    Réponses: 2
    Dernier message: 23/01/2009, 23h42
  5. Regex et capture de sous-chaines
    Par flo_k dans le forum C
    Réponses: 0
    Dernier message: 11/11/2008, 19h07

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