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 :

Rechercher un motif plusieurs fois


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut Rechercher un motif plusieurs fois
    Bonjour,

    Voilà, j'ai essayé de mettre en place une expression régulière me permettant de sortir des arguments dans une chaine de caractères :

    Ma chaine type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <!-- DESIGNATION commande1="valeur1" commande2="valeur2" ... -->
    maintenant mon expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#<!-- (.*?) (.*?=.*?) -->#",$value,$matches);
    Lorsque je n'ai qu'un paramètre (commande1="valeur1"), ça marche impeccable, mais si j'ai plusieurs paramètres comme dans l'exemple ci-dessus, ça va me trouver toutes les commandes ensembles (commande1="valeur1" commande2="valeur2" ...)

    donc comment puis-je attraper mes commandes séparément ? de manière à ce que mon tableau $matches sépare bien toutes les commandes ?

    Merci pour votre aide ^^

  2. #2
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    Bonjour,

    est-ce que par hasard le terme de 'commande' serait invariable ?
    Si c'est le cas il faudrait faire un masque plus "restreint"

    Règle n°1 du forum francophone : Parler le français...
    Pas de question technique par MP, le forum est fait pour çà, merci.

  3. #3
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Huntress Voir le message
    Bonjour,

    est-ce que par hasard le terme de 'commande' serait invariable ?
    Si c'est le cas il faudrait faire un masque plus "restreint"
    Non, commande est variable. ^^

    le but est de récupérer des paramètres qui peuvent être dans ma balise au nombre de 0, 1, 2 etc ... avec des valeurs différentes.

  4. #4
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    Et je suppose qu'un explode sur les espaces ne conviendrait pas, puisque tes valeurs peuvent en contenir ?

    Règle n°1 du forum francophone : Parler le français...
    Pas de question technique par MP, le forum est fait pour çà, merci.

  5. #5
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Huntress Voir le message
    Et je suppose qu'un explode sur les espaces ne conviendrait pas, puisque tes valeurs peuvent en contenir ?
    Oui assurément ^^ c'est pour celà que je recherche un motif qui puisse me permettre de récupérer mes arguments séparément. J'avoue être un peu minable sur les expressions régulières.

  6. #6
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    Voui mais entre minables on se sent un peu moins seuls

    Essaye çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $masque = '#[^\s]+=".*?"#';

    Règle n°1 du forum francophone : Parler le français...
    Pas de question technique par MP, le forum est fait pour çà, merci.

  7. #7
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    ça ne fonctionne pas ... car ça me parse n'importe quelle chaine...
    j'ai modifié comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(preg_match_all('#<!-- (.*?) ([^\s]+=".*?") -->#',$value,$matches))
    mais rien à faire ça m'attrape "TOUTE MA BALISE", "le nom de ma balise", et "tous mes paramètres dans la meme string" ???

    Voici le retour du preg_match_all :

    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
    array(3) {
      [0]=>
      array(1) {
        [0]=>
        string(59) "<!-- MABOUCLE commande="variable" commande2="variable2" -->"
      }
      [1]=>
      array(1) {
        [0]=>
        string(8) "MABOUCLE"
      }
      [2]=>
      array(1) {
        [0]=>
        string(41) "commande="variable" commande2="variable2""
      }
    }
    si tu as une idée...

  8. #8
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    Tu peux me donner une ligne complète parce que moi çà marche...

    Règle n°1 du forum francophone : Parler le français...
    Pas de question technique par MP, le forum est fait pour çà, merci.

  9. #9
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    voici ma classe :

    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
    class templatePattern {
     
      protected $pattern;
     
    	public function __construct($file) {
        $this->pattern = array();
        $this->Compile(file($file,1));
        $this->Run();
      }
     
      // <!-- INCLUDE myfile.html -->
      protected function Compile($lines) {
        foreach($lines as $value) {
          $matches = array();
          if(preg_match("#<!-- INCLUDE (.*?) -->#", $value, $matches)) {
            $this->Compile(file($matches[1],1));
          } elseif(preg_match_all('#<!-- (.*?) ([^\s]+=".*?") -->#',$value,$matches)) {
            exit(var_dump($matches));
          } else {
            array_push($this->pattern, $value);
          }
        }
      }
     
      protected function Run() {
        foreach($this->pattern as $value) {
          print $value;
        }
      }
     
    }
    voici mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <html>
    <head>
      <title>Administration de votre pizzeria</title>
    </head>
    <body>
     
    <!-- INCLUDE menuAdmin.html -->
     
    <!-- MABOUCLE commande="variable" commande2="variable2" -->
     
    </body>
    </html>
    c'est la boucle MABOUCLE que je cherche à parser
    j'ai fait un exit(var_dump($matches)); pour afficher le résultat de l'opération lorsque ma ligne de boucle est traitée par le compilateur.

  10. #10
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    Bon voici ce que j'ai trouvé. Jusque là si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#<!-- (.*?) (.*?=".*?") (.*?=".*?") -->#',$value,$matches);
    ça marche, ce que j'ai besoin c'est juste de dire que ce motif (.*?=".*?") se répète un certain nombre de fois (0, 1 fois, 2 fois ou plus...).

    Est-il possible d'éviter de répéter cinquante fois (.*?=".*?") pour récupérer tous les arguments ???

  11. #11
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    (.*?=".*?")+


  12. #12
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    ça a l'air de fonctionner, mais apparemment j'ai le preg_match_all qui ne me capture que la dernière occurence de mon motif.

    mes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <!-- MABOUCLE commande="variable" commande2="variable2" commande3="variable3" commande4="variable4" -->
    mon motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#<!-- (.*?) ((.*?)="(.*?)")* -->#',$value,$matches)
    le résultat du preg_match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    array(5) {
      [0]=>
      string(103) "<!-- MABOUCLE commande="variable" commande2="variable2" commande3="variable3" commande4="variable4" -->"
      [1]=>
      string(8) "MABOUCLE"
      [2]=>
      string(22) " commande4="variable4""
      [3]=>
      string(10) " commande4"
      [4]=>
      string(9) "variable4"
    }
    j'ai l'impression que le motif est bon mais que le preg_match_all ne me retourne que la dernière valeur.

    En plus il m'a pris un espace avant "commande4" alors que j'aimerais qu'il ne me le prenne pas.

    Merci de votre aide.

  13. #13
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    Me revoilà

    Alors j'ai çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $chaine = '<!-- MABOUCLE commande="variable" commande2="variable2" commande3="variable3" -->';
    $masque = '#([^\s]*) ([^\s]+=".*?")#';
     
    preg_match_all($masque, $chaine, $r);
     
    echo '<pre>';
    print_r($r);
    echo '</pre>';

    et voilà ce qu'elle donne :

    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
    Array
    (
        [0] => Array
            (
                [0] => MABOUCLE commande="variable"
                [1] =>  commande2="variable2"
                [2] =>  commande3="variable3"
            )
     
        [1] => Array
            (
                [0] => MABOUCLE
                [1] => 
                [2] => 
            )
     
        [2] => Array
            (
                [0] => commande="variable"
                [1] => commande2="variable2"
                [2] => commande3="variable3"
            )
     
    )

    Pour ma part je trouve le masque un peu spécial et le résultat aussi... mais bon si çà peut te convenir...

    Règle n°1 du forum francophone : Parler le français...
    Pas de question technique par MP, le forum est fait pour çà, merci.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/08/2014, 12h42
  2. Réponses: 22
    Dernier message: 13/09/2013, 14h20
  3. Réponses: 4
    Dernier message: 02/09/2004, 21h43
  4. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49

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