[php] PCRE ungreedy
5 messages
• Page 1 sur 1
-

ltressens - WRInaute impliqué

- Messages: 551
- Inscription: 2 Avr 2004
[php] PCRE ungreedy
Bonjour,
Je n'arrive pas à rendre une regexp ungreedy (non gourmande).
Exemple :
Pour moi le ? dans .*? veut dire "en essayant de matcher le moins de positions possibles"... pas gourmande quoi...
Mais là où je m'attend à matcher "Word1 Word2", il matche "Word1 Word1 Word2"....
Une idée ?
Merci d'avance
Je n'arrive pas à rendre une regexp ungreedy (non gourmande).
Exemple :
- Code: Tout sélectionner
preg_match_all(
'/Word1.*?Word2/',
'Word1 Word1 Word2',
$matches);
print_r($matches);
Array
(
[0] => Array
(
[0] => Word1 Word1 Word2
)
)
Pour moi le ? dans .*? veut dire "en essayant de matcher le moins de positions possibles"... pas gourmande quoi...
Mais là où je m'attend à matcher "Word1 Word2", il matche "Word1 Word1 Word2"....
Une idée ?
Merci d'avance
-

ltressens - WRInaute impliqué

- Messages: 551
- Inscription: 2 Avr 2004
idem avec le modifier /U
Mais je me suis rendu compte que ca fonctionne si je matche un espace :
Ca ne fonctionne pas avec le . :
Voilà, toujours aussi perplexe, mais merci de ta réponse bool !
Mais je me suis rendu compte que ca fonctionne si je matche un espace :
- Code: Tout sélectionner
Word1 *?Word2
Ca ne fonctionne pas avec le . :
- Code: Tout sélectionner
Word1.*?Word2
Voilà, toujours aussi perplexe, mais merci de ta réponse bool !
- jcaron
- WRInaute accro

- Messages: 2685
- Inscription: 13 Fév 2004
Re: [php] PCRE ungreedy
ltressens a écrit:Pour moi le ? dans .*? veut dire "en essayant de matcher le moins de positions possibles"... pas gourmande quoi...
Mais là où je m'attend à matcher "Word1 Word2", il matche "Word1 Word1 Word2"....
man perlre a écrit:By default, a quantified subpattern is "greedy", that is, it will match as many times as possible (given a particular starting location) while still allowing the rest of the pattern to match.
Donc la différence, c'est "à partir d'un point de départ donné". Donc:
"Word1 Word1 Word2 Word1 Word2" =~ /Word1.*?Word2/ ne matchera que Word1 Word1 Word2 (plutôt que toute la chaîne), mais ne commencera pas plus tard (pour ne matcher que Word1 Word2).
ltressens a écrit:Mais je me suis rendu compte que ca fonctionne si je matche un espace :
- Code: Tout sélectionner
Word1 *?Word2
Normal: tu n'acceptes que des espaces entre Word1 et Word2, donc forcément, Word1 Word2 ça passe alors que Word1 Word1 Word2 ça ne passe pas.
Si tu nous dit ce que tu cherches à faire précisément on peut peut-être te trouver une solution adaptée...
Jacques.
5 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

