REGEX

akavir
Invité n'ayant pas de compte PHPfrance

24 juil. 2019, 12:41

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 ?

Avatar du membre
Mammouth du PHP | 1609 Messages

24 juil. 2019, 12:51

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.
Développeur web depuis + de 20 ans

Akavire
Invité n'ayant pas de compte PHPfrance

24 juil. 2019, 12:55

justement il devrait renvoyer False non :o?
il y en plus qu'un là

et si il renvoie TRUE je ne comprend pas l'intérêt notamment par rapport à + et *

Avatar du membre
Mammouth du PHP | 1609 Messages

24 juil. 2019, 12:59

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é.
Modifié en dernier par Saian le 24 juil. 2019, 13:04, modifié 1 fois.
Développeur web depuis + de 20 ans

Akavir
Invité n'ayant pas de compte PHPfrance

24 juil. 2019, 13:04

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)

Avatar du membre
Mammouth du PHP | 1609 Messages

24 juil. 2019, 13:08

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.
Développeur web depuis + de 20 ans

Akavir
Invité n'ayant pas de compte PHPfrance

24 juil. 2019, 13:09

Un grand merci camarade, j'ai tout compris !

Avatar du membre
Mammouth du PHP | 1609 Messages

24 juil. 2019, 13:15

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.
Développeur web depuis + de 20 ans

Akavir
Invité n'ayant pas de compte PHPfrance

24 juil. 2019, 13:35

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 !