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 :

Trouver les répétitions d'un motif entre deux motifs


Sujet :

Langage PHP

  1. #1
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut Trouver les répétitions d'un motif entre deux motifs
    Bonjour à tous, j'essaie depuis un petit moment déjà à récupérer des variables php présentes entre crochet du type :
    < $bon > $pas_bon < $re_bon $encore_bon >

    En fait les variables php sont un exemple, j'aimerai pouvoir chercher tout les segment de chaînes correspondant à un motif entouré par deux autres (balises ouvrantes et fermantes).
    Ça pourrait donc être par exemple (et sans chercher l'exactitude) tous les noms d'attribut des balises images :
    Ouvrante : <img
    Fermante : />
    motif : [a-z]*=

    Et dans mon cas de "pseudo" balises php :
    Ouvrante : <
    Fermante : >
    motif : \$[a-z0-9_-]*
    Je dit bien pseudo car les "-" ne sont normalement pas accepté et que je n'ai que de simple crochet pour balise.

    Je suis arrivé à ce pattern :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<[^>]*)(\$[a-z0-9_-]*)([^<]*>)
    Le problème est qu'il ne me sort que la dernière variables trouvée entre crochets. Appliqué à :
    < $ok no $ok2 $ok2bis > $no2 no3 < $ok3 $ok4 no4 >

    Je n'obtiens que :
    Concordance 1: Début = 0, Fin = 23
    Groupe 0 = < $ok no $ok2 $ok2bis >
    Groupe 1 = < $ok no $ok2
    Groupe 2 = $ok2bis
    Groupe 3 = >

    Concordance 2: Début = 33, Fin = 50
    Groupe 0 = < $ok3 $ok4 no4 >
    Groupe 1 = < $ok3
    Groupe 2 = $ok4
    Groupe 3 = no4 >

    Si quelqu'un a une solution je suis preneur.

  2. #2
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    pourquoi pas ajouter les espaces dans $[a-z0-9_- ] et ensuite faire un split() sur les espaces.

  3. #3
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    si je fait ça je récupèrerai :
    $ok no $ok2 $ok2bis
    et
    $ok3 $ok4 no4
    apres split il faudra encore que je recherche si chaque clé du tableau commence par $. Je pourrai donc plutôt appliquer la regex du motif central mais je fait du coup un regex pour me sortir le contenu des balises puis pour chaque contenu trouvé une regex pour sortir les variables... j'aurai aimé une solution à une seule regex mais ça m'a l'air ardu.

  4. #4
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1

  5. #5
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    hmmm, non relis encore un peu :p

  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
    Citation Envoyé par cahnory Voir le message
    si je fait ça je récupèrerai :
    $ok no $ok2 $ok2bis
    et
    $ok3 $ok4 no4
    apres split il faudra encore que je recherche si chaque clé du tableau commence par $. Je pourrai donc plutôt appliquer la regex du motif central mais je fait du coup un regex pour me sortir le contenu des balises puis pour chaque contenu trouvé une regex pour sortir les variables... j'aurai aimé une solution à une seule regex mais ça m'a l'air ardu.
    La solution en une seule regexp sera compliquée et horriblement gourmande en performances. C'est à déconseiller dans les deux cas !

    Ma préférence irait à un truc de ce genre :
    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
    <?php
    $str = '< $ok no $ok2 $ok2bis > $no2 no3 < $ok3 $ok4 no4 >';
     
    $values = array();
     
    if ( preg_match_all('/<\s*+([^>]++)\s*>/', $str, $m) ) {
     
        foreach ($m[1] as $content) {
            preg_match_all('/\$[a-z0-9_-]++/', $content, $result);
            $values = array_merge ($values, $result[0]);
        }
     
    }
     
    print_r($values);
    Simple à maintenir, rapide à exécuter. Servir frais et profiter.

Discussions similaires

  1. sed : supprimer une séquence entre deux motifs
    Par arty0 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 31/03/2013, 16h15
  2. [RegEx] Comment récupérer le texte entre deux motifs ?
    Par whitespirit dans le forum Langage
    Réponses: 6
    Dernier message: 25/03/2010, 21h59
  3. Réponses: 7
    Dernier message: 19/06/2008, 15h18
  4. lister tous les fichiers avec des différences entre deux répertoires.
    Par contremaitre dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/03/2008, 15h24

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