[php] PCRE ungreedy


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

[php] PCRE ungreedy

Message le Dim Juin 08, 2008 17:29

Bonjour,

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


Bool
WRInaute passionné
WRInaute passionné
 
Messages: 1290
Inscription: 26 Fév 2004

Message le Dim Juin 08, 2008 17:42

Hello,

et directement avec l'option Ungreedy ?
Code: Tout sélectionner
'/Word1.*Word2/U'


ltressens
WRInaute impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

Message le Dim Juin 08, 2008 17:53

idem avec le modifier /U

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 !


Bool
WRInaute passionné
WRInaute passionné
 
Messages: 1290
Inscription: 26 Fév 2004

Message le Dim Juin 08, 2008 18:11

Euh.... dans mes souvenirs ça marchait bien pourtant :S

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: [php] PCRE ungreedy

Message le Dim Juin 08, 2008 22:58

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.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités