[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
Configuration: Windows XP
Safari 532.0

3 réponses

  1. 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
  2. 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
  3. hamzafes Messages postés 258 Statut Membre 54
     
    merci bien, cette solution marche parfaitement
    0