Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 03/10/2007, 12h14   #1
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
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 :
<!-- DESIGNATION commande1="valeur1" commande2="valeur2" ... -->
maintenant mon expression :
Code :
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 ^^
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 13h32   #2
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h15   #3
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h34   #4
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h45   #5
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h46   #6
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
Voui mais entre minables on se sent un peu moins seuls

Essaye çà

Code :
$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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h56   #7
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
ça ne fonctionne pas ... car ça me parse n'importe quelle chaine...
j'ai modifié comme ça :

Code :
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 :
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...
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 14h57   #8
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 15h02   #9
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
voici ma classe :

Code :
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 :
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 16h43   #10
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
Bon voici ce que j'ai trouvé. Jusque là si je fais :

Code :
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 ???
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 16h49   #11
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 286
Points : 2 286
(.*?=".*?")+

koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 17h28   #12
Membre du Club
 
Avatar de alejandro
 
Alexandre Bastien
Inscription : septembre 2004
Messages : 105
Détails du profil
Informations personnelles :
Nom : Alexandre Bastien

Informations forums :
Inscription : septembre 2004
Messages : 105
Points : 54
Points : 54
Envoyer un message via MSN à alejandro
ç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 :
<!-- MABOUCLE commande="variable" commande2="variable2" commande3="variable3" commande4="variable4" -->
mon motif :
Code :
preg_match_all('#<!-- (.*?) ((.*?)="(.*?)")* -->#',$value,$matches)
le résultat du preg_match :
Code :
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 20h36   #13
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
Me revoilà

Alors j'ai çà :

Code :
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 :
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 19h45.


 
 
 
 
Partenaires

Hébergement Web