Salut,
Je suis tombé sur cette regexp : # \w* (?![0-9]{1}) (\w+)#.
Mon souci, c'est que je ne la comprends pas bien.
Quelqu'un aurait-il la bonté de la détailler ? En particulier (?![0-9]{1}).
Merci ^^ !
Salut,
Je suis tombé sur cette regexp : # \w* (?![0-9]{1}) (\w+)#.
Mon souci, c'est que je ne la comprends pas bien.
Quelqu'un aurait-il la bonté de la détailler ? En particulier (?![0-9]{1}).
Merci ^^ !
Dernière modification par rawsrc ; 24/03/2016 à 10h30. Motif: Balises [c][/c]
J'espère que tu ne t'es pas fait mal.
(?!...) est un test avant négatif (negative lookahead), il signifie "non suivi de" et s'applique uniquement à la position où il se trouve dans la pattern.
Si par exemple j'écris (?!K)[A-Z]+, et que je l'applique à la chaîne "LAPIN", j'obtiendrai "LAPIN", par contre si je l'applique à la chaîne "KOALA", j'obtiendrai "OALA".
À noter qu'utiliser le quantificateur {1} dans une pattern ne sert strictement à rien, puisque par défaut les éléments ne sont là qu'une fois.
Merci pour le retour!
Si on considère ce code :
Ca donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?php //Enter your code here, enjoy! $p = "# \w*(?![0-9]{1}) (\w+)#"; $s = "PHP5 released PHP6 not released"; preg_match_all($p, $s, $matches); print_r($matches[1]);
Ce que je ne comprends pas, surtout si je suis ton explication PHP6 contient bien un chiffre...Array ( [0] => PHP6 [1] => released )
Dernière modification par Celira ; 23/03/2016 à 14h04.
ça doit être du au comportement des raccourcis genre \w, que je n'ai jamais trop utilisés:
ces métacaractères acceptent les nombres!
du coup:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?php $p = "/(?:[a-z]+(?![0-9]) ?)+/"; $s = "PHP5 released PHP6 not released"; preg_match_all($p, $s, $matches); print_r($matches[0]); //Array ( [0] => released [1] => not released ) ?>
si tu veux PHP aussi essaie en lookbehind:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php $p = "/(?:[a-z]+(?<![0-9]) ?)+/i"; $s = "PHP5 released PHP6 not released"; preg_match_all($p, $s, $matches); print_r($matches[0]); //Array ( [0] => PHP [1] => released PHP [2] => not released ) ?>
Autre manière en lookahead
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?php $p = "/(?![0-9]) ?((?:[a-z]+ ?)+)/i"; $s = "PHP5 released PHP6 not released"; preg_match_all($p, $s, $matches); print_r($matches[1]); ?>
pour plus d'informations sur les assertions négatives, il y a un paragraphe les concernant dans ce tutoriel :
http://g-rossolini.developpez.com/tu...=syntaxe#LII-8
Merci d'utiliser les balises codes quand tu postes du code de manière à le rendre lisible.
De toute manière, ce test avant ne sert à rien non plus puisque il est placé juste avant un espace (il vérifie que l'espace qui va suivre n'est pas un chiffre, ce qui est toujours vrai). Cette pattern est donc équivalente à
Code : Sélectionner tout - Visualiser dans une fenêtre à part # \w* (\w+)#
Partager