Une regex avec preg_match

Petit nouveau ! | 4 Messages

20 oct. 2009, 18:19

Salam,

j'ai une chaine de caractères :
...[name] hamza [end name] [id]ab6789-58ss[end id] [name]mohamed[end name][id]cc6989-55s[end id]...

et je veux extraire juste le premier id . alors je fais comme ça :

preg_match("#[id](.+)[end id]#", $text, $matches);

résultat :
ab6789-58ss[end id] [name]mohamed[end name][id]cc6989-55s

preg_match ne s'arrete qu'à la deuxième balise [end id] !!!

y'a-t-il une façon de dire à preg_match de s'arrêter à la première balise [end id] ?



Merci et Allah mo3ine

Mammouth du PHP | 2937 Messages

20 oct. 2009, 18:39

Bienvenue dans l'univers des captures gloutonnes ! ;)

Autrement dit, pour éviter que la capture de ton expression rationnelle n'englobe plusieurs balises entre crochets, de deux choses l'une :
  1. soit tu ajoutes un ? après le quantifiant, comme suit
    preg_match ('#[id](.+?)[end id]#', $text, $matches);
  2. soit tu ajoutes le masque U (U majuscule, pour ungreedy, qui veut dire « non glouton » en anglais) après le délimiteur de fin d'expression rationnelle, comme suit
    preg_match ('#[id](.+)[end id]#U', $text, $matches);
Si tu veux tester par toi-même, je te conseille la page de test d'expressions rationnelles de Lumadis. ;)

Petit nouveau ! | 4 Messages

20 oct. 2009, 18:49

merci bien, les deux techniques fonctionnent parfaitement.

une deuxième question, preg_match s'arrête au premier retour à la ligne, est-ce qu'on peut changer ça?