[PHP] une regex avec preg_match

hamzafes Messages postés 258 Statut Membre -  
hamzafes Messages postés 258 Statut Membre -
Bonjour,
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
A voir également:

3 réponses

Groarh Messages postés 706 Statut Membre 185
 
Salut,
par défaut, une expression régulière avec une * ou un + cherche à correspondre à la plus grande partie de texte possible, on dit qu'elle est gourmande (en anglais greedy).
Pour demander à ta regexp de s'arrêter à la première correspondance, il faut la faire devenir non-gourmande ou paresseuse (en anglais lazy), en rajoutant un ? ce qui donne *? (on entend parfois parler d'étoile paresseuse) ou +? .

Voici une page de l'excellent site regular-expressions.info (en anglais) qui parle des regexp gourmandes et paresseuses : https://www.regular-expressions.info/repeat.html#greedy

Bonne lecture ;)
1
Utilisateur anonyme
 
rajoute un U à la fin de ta regex pour la rendre "non-gourmande" ( = Ungreedy ) :
preg_match("#[id](.+)[end id]#iU", $text, $matches); 

(j'ai rajouté un i pour l'insensibilité à la casse, à toi de voir si tu gardes ou non)

0
hamzafes Messages postés 258 Statut Membre 54
 
merci bien, cette solution marche parfaitement
0