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 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
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
Vieux 03/10/2007, 13h32   #2 (permalink)
Membre éprouvé
 
Avatar de Huntress
 
Date d'inscription: août 2004
Messages: 452
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 14h15   #3 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 14h34   #4 (permalink)
Membre éprouvé
 
Avatar de Huntress
 
Date d'inscription: août 2004
Messages: 452
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 14h45   #5 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
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.
alejandro est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 14h46   #6 (permalink)
Membre éprouvé
 
Avatar de Huntress
 
Date d'inscription: août 2004
Messages: 452
Par défaut

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
Vieux 03/10/2007, 14h56   #7 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
Par défaut

ç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 :
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
Vieux 03/10/2007, 14h57   #8 (permalink)
Membre éprouvé
 
Avatar de Huntress
 
Date d'inscription: août 2004
Messages: 452
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.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 15h02   #9 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
Par défaut

voici ma classe :

Code :
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 :
<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
Vieux 03/10/2007, 16h43   #10 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
Par défaut

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
Vieux 03/10/2007, 16h49   #11 (permalink)
Modérateur
 
Date d'inscription: janvier 2005
Messages: 2 302
Par défaut

(.*?=".*?")+

koopajah est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/10/2007, 17h28   #12 (permalink)
Membre du Club
 
Avatar de alejandro
 
Date d'inscription: septembre 2004
Messages: 83
Envoyer un message via MSN à alejandro
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 :
<!-- MABOUCLE commande="variable" commande2="variable2" commande3="variable3" commande4="variable4" -->
mon motif :
Code :
preg_match_all('#<!-- (.*?) ((.*?)="(.*?)")* -->#',$value,$matches)
le résultat du preg_match :
Code :
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
Vieux 03/10/2007, 20h36   #13 (permalink)
Membre éprouvé
 
Avatar de Huntress
 
Date d'inscription: août 2004
Messages: 452
Par défaut

Me revoilà

Alors j'ai çà :

Code :
$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 :
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
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > Langage > Regex



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 14h00.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.