Bonjour je ne comprend pas quel est la différence entre .*? et .*
car * et ? sont tout deux des quantificateur
qu'est ce que le ? apporte de plus a cette expression .*?
merci d'avance
Version imprimable
Bonjour je ne comprend pas quel est la différence entre .*? et .*
car * et ? sont tout deux des quantificateur
qu'est ce que le ? apporte de plus a cette expression .*?
merci d'avance
Bonjour,
A moins de limité le *, je ne vois pas a quoi cela sert, même pourquoi limité le *
Tu as vu ça dans quel cadre ?
je voulais faire un replace de se qui se trouve entre /* */ par string.empty
et quand j ' ai plusieurs notreplace/*Content*/ dans la chaine et que j' utilise .* il va faire un remove sur tout sauf se qui est devant le premier
il ne garde que le premier des notreplace, donc j ai été contrain de faire ceci dans ma regex .*?
Alors cela veut dire qu'il prend la fin
ces pour cela qu il faut limiter * si je comprend bien
le ? représente la fin de la chaine, donc oui
le "?" la fin de chaine ???? c'est "$" la fin de chaine !!!!
la différence entre * et *? est je crois que la première version va essayer de matcher avec le pattern qui comporte le plus de caractère alors que le second va essayer de matcher avec le motif qui en comporte le moins.*
pour aller plus loin cherche regex+lazy et regex+greedy.Code:
1
2 preg_match_all('#a.*?a#', 'amanapa', $arr, PREG_PATTERN_ORDER); preg_match_all('#a.*a#', 'amanapa', $arr, PREG_PATTERN_ORDER);
MaitrePylos -1.
Oui,oui me suis trompé. Arrive a tout le monde.
OK je vous remercie pour vos réponse :ccool:
Éffectivement, le ? sert à passer un quantificateur (* + {n,}) de greedy à non-greedy par défaut. Mais il sert aussi à faire le contraire (non-greedy->greedy) si on utilise le modifier U qui rend tous les quantificateurs de la pattern non-greedy. De plus, il peut être inopérant selon les circonstances.
exemple:On obtiens :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 $string = 'Janine mange des bananes.'; // cette chaîne comporte la sous-chaîne "an" deux fois de part et d'autre de la lettre g $patterns = array( // avec les quantificateurs greedy (par défaut) '/[^g]*(an[^g]*g.*an)/', '/^[^g]*?(an[^g]*g.*an)/', '/^[^g]*(an[^g]*g.*?an)/', '/^[^g]*?(an[^g]*g.*?an)/', // avec les quantificateurs non-greedy (par le modifier U) '/^[^g]*?(an[^g]*g.*?an)/U', '/^[^g]*(an[^g]*g.*?an)/U', '/^[^g]*?(an[^g]*g.*an)/U', '/^[^g]*(an[^g]*g.*an)/U' ); // le quantificateur du milieu peut être greedy ou non-greedy, // cela n'a pas d'importance, car il est coincé à droite par la lettre g et obligé d'aller jusqu'à elle, // et à gauche par le premier quantificateur qui est évalué avant lui. // C'est le premier quantificateur qui, évalué en premier, conditionne la taille de la capture à gauche du g. // Le test s'effectue uniquement sur le premier et le dernier quantificateur. foreach ($patterns as $pattern) { preg_match( $pattern, $string, $match); echo $match[1] . '<br/>'; }
ange des banan
anine mange des banan
ange des ban
anine mange des ban
ange des banan
anine mange des banan
ange des ban
anine mange des ban
À ce titre le ? peut être plutôt considéré comme un commutateur greedy/non-greedy.