Page 1 sur 1
REGEX
Posté : 24 juil. 2019, 12:41
par akavir
Bonjour
Sur mon cours de php il est dit que le quantifieur ? permet de constater 0 ou 1 fois la présence d'un caractère donné
if (preg_match('#o?#','bonjooour'))
{
echo 'TRUE';
}
else
{
echo 'FALSE';
}
renvoie TRUE, pourquoi ?
Re: REGEX
Posté : 24 juil. 2019, 12:51
par Saian
Salut, parce qu'il y a des o dans le string. Le ? est pour dire 0 ou 1. Je crois même que dans ce cas, même sans o dans le string ou même avec un string vide, ça va matcher à tous les coups.
Re: REGEX
Posté : 24 juil. 2019, 12:55
par Akavire
justement il devrait renvoyer False non

?
il y en plus qu'un là
et si il renvoie TRUE je ne comprend pas l'intérêt notamment par rapport à + et *
Re: REGEX
Posté : 24 juil. 2019, 12:59
par Saian
Pas comme ça que ça fonctionne.
Là ton expression va capturer tous les o, mais un par un. Elle capture même tous les espacements entre chaque lettre.
Avec o+ ça capturerait o et ooo.
Et o* va capturer o et ooo mais aussi tous les espacements entre chaque lettre.
PS : si tu veux vérifier qu'il n'y a pas de o un strpos($string, 'o') === false sera plus approprié.
Re: REGEX
Posté : 24 juil. 2019, 13:04
par Akavir
D'accord je suis pas certain d'avoir calé,
ça veut bien dire que
même si j'écris boooooooooooooooooooooooooooooooooonjour mon script va renvoyer true
Dans ce cas quel est l'intérêt réel de * ou + ?
(merci pour ta patience)
Re: REGEX
Posté : 24 juil. 2019, 13:08
par Saian
Bah chacun de ces quantifiers sont clairement utiles, ça dépend des expressions que tu as besoin d'écrire.
En l'occurrence si tu veux t'assurer qu'il n'y a pas de o dans ta chaine, je pense que tu peux oublier les expressions régulières et plutôt utiliser le strpos comme indiquer précédemment : strpos($string, 'o') === false
Les expressions régulières servent a capturer des éléments d'une chaine, pas à capturer des éléments non présents dans la chaine.
Ça retourne false quand rien n'est capturé, or là il y a bien des éléments capturés.
Re: REGEX
Posté : 24 juil. 2019, 13:09
par Akavir
Un grand merci camarade, j'ai tout compris !
Re: REGEX
Posté : 24 juil. 2019, 13:15
par Saian
En fait tu peux vérifier par preg_match aussi qu'il n'y a pas de o mais avec un
preg_match('`o`', $string) tout simplement, sans quantifier.
La ça ne capturera vraiment que les o mais ça ne te dira pas si des o se suivent. false si pas de o et true si o présents.
Si le problème c'est de vérifier qu'il n'y a pas au moins 2 o qui se suivent l'expression serait plutôt
o{2,}.
Si tu n'as que des o solos ça retournera false mais si tu as 2 o où plus qui se suivent ça retournera true.
PS : le ? on s'en sert aussi souvent comme une sorte de limiteur genre tu veux capturer tout ce qui est entre " mais tu veux capturer chaque groupe de " et non pas du premier au dernier tu fais :
".*?"
La par exemple le
.* va capturer 2 " qui se suivent mais si tu fais
".+?" alors il faut que les " aient un contenu entre eux (au moins 1 caractère).
Avec
"bon"jo"oou"r "",
".*?" capture
"bon",
"oou",
""
".+?" capture
"bon",
"oou"
".+" capture
"bon"jo"oou"r ""
Tu as plusieurs site genre
https://regexr.com/ qui te permettent de tester des regex pour mieux comprendre comment ça fonctionne.
Re: REGEX
Posté : 24 juil. 2019, 13:35
par Akavir
D'accord, en tous cas ça m'aura bien aidé, j'avais rien compris du tout !
Je fais aller faire un tour sur ton lien et travailler ces expressions régulières !
à la prochaine !