[PHP] une regex avec preg_match

Fermé
hamzafes Messages postés 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 - 20 oct. 2009 à 17:26
hamzafes Messages postés 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 - 20 oct. 2009 à 19:18
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 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
20 oct. 2009 à 19:00
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
20 oct. 2009 à 19:10
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 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 54
20 oct. 2009 à 19:18
merci bien, cette solution marche parfaitement
0