Apprendre PHP (15/19) - Les expressions régulières (Regex)

Dans cette leçon vidéo, le formateur explique les expressions régulières (regex) en PHP, en se concentrant sur la famille PCRE, la plus utilisée. Il montre comment créer un formulaire simple (index.php) avec un champ texte et un bouton de validation, puis utilise la fonction preg_match pour tester la conformité d’une chaîne à un motif regex. Le cours détaille les concepts fondamentaux des regex : délimiteurs, ancres (^ et $), classes de caractères, intervalles (a‑z), quantificateurs (+, , ?, {m,n}), opérateurs de groupe et d’alternance (parenthèses, |), exclusion de caractères, options de case‑insensitivity (i), échappement de caractères spéciaux (\.), et utilisation du point (.) comme joker. Il illustre chaque notion par des exemples concrets (recherche du caractère « a », validation d’une URL, etc.) et montre comment rendre des parties du motif optionnelles avec le point d’interrogation et les parenthèses. Le formateur introduit également les raccourcis PCRE (\w, \d, \W, etc.) et compare l’usage de regex avec les fonctions intégrées de PHP : filtervar avec les constantes FILTERVALIDATEEMAIL, FILTERVALIDATEURL, FILTERVALIDATEIP, etc., qui offrent une validation prête à l’emploi. Enfin, il mentionne les fonctions complémentaires pregreplace et preg_split, rappelant que le même motif peut être réutilisé avec ces fonctions. Le ton est pédagogique, avec des démonstrations en direct, et le contenu vise à donner aux développeurs PHP les bases nécessaires pour créer et tester des expressions régulières robustes.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de PHP. Aujourd'hui nous allons voir les expressions régulières. Les expressions régulières ou expressions rationnelles dites aussi expressions normalisées, que l'on abrège souvent en Regex, sont des chaînes de caractères particulières appelées motifs ou occurrences qui permettent de vérifier si d'autres chaînes de caractères respectent un format ou un modèle défini. Par exemple, une Une adresse mail, un numéro de téléphone, une adresse IP ou URL d'un site web sont des chaînes de caractères dont le format est conventionnel. Afin de s'assurer si ce format est respecté, on leur applique l'expression régulière adaptée. Dans l'une des vidéos consacrées au langage JavaScript, nous avons déjà traité les expressions régulières dans ce langage. En gros, ça ne change pas trop de ce que nous allons voir aujourd'hui. En effet, les expressions régulières sont implémentées en suivant des standards préétablis. En PHP, on en trouve 2, à savoir les POSIX et les PCRE. La famille d'expressions régulières qui se base sur POSIX est la première à être intégrée au PHP. Cependant, la famille PCRE qui est compatible au langage Perl reste la préférée des développeurs. Pour information, Perl est un langage CGI dont PHP est inspiré en partie. Sachez que les POSIX et les PCRE utilisent presque les mêmes notations, à quelques différences près. Et si PCRE est privilégiée au milieu des développeurs, c'est parce qu'elle est plus rapide surtout vis-à-vis des expressions régulières complexes. Alors, dans cette vidéo, nous allons traiter les expressions régulières de la famille PCRE. Considérons la page index.php suivante. Elle renferme un formulaire qui contient une zone de texte nommée str et un bouton Valider, ce qui donne le rendu suivant. L'objectif c'est d'écrire une chaîne de caractères et quand je clique sur le bouton Valider, je vais vérifier si elle respecte une expression régulière donnée. Alors on va écrire le code suivant. Quand j'aurai cliqué sur le bouton Valider, je vais vérifier l'expression régulière que je vais définir à l'aide de la fonction PregMatch. La fonction PregMatch est une fonction qui permet de vérifier une expression régulière en utilisant le standard PCRE. Il contient généralement 2 paramètres. Bien sûr, on peut mettre d'autres paramètres supplémentaires, mais pour nous, 2 paramètres nous suffisent tellement. On mettra donc ici en guise de premier argument l'expression régulière elle-même et le deuxième argument c'est la chaîne de caractères sur laquelle je vais l'appliquer. Dans ce cas c'est la chaîne str. La fonction preg_match retourne un résultat booléen, c'est-à-dire si la chaîne de caractères vérifie l'expression régulière donnée, dans ce cas elle retourne true, sinon elle retourne false. On mettra donc ici if, c'est-à-dire si ça retourne true, on va mettre la variable message On mettra dedans chaîne valide. Je mettrai même un style pour colorer le texte en vert. Comme ça. Else, alors il suffit de copier cette ligne et je mettrai ici chaîne invalide. Et là c'est la couleur rouge. Maintenant on va exprimer une expression de base. Par exemple on va vérifier si la chaîne de caractères contient le caractère a. On mettra donc ici juste a comme ceci. Ça veut dire on va chercher si la chaîne str renferme le caractère a quelle que soit sa position. Si c'est le cas alors preg_match retournera True sinon False. Il y a juste une chose c'est que les familles PCRE exigent d'utiliser ce qu'on appelle les délimiteurs de l'expression régulière. C'est-à-dire vous mettez un symbole au début, le même symbole vous le mettez à la fin. Il y en a qui préfèrent mettre le slash, il y en a qui préfèrent mettre le dièse, etc. Donc moi par exemple je vais mettre dièse. Comme ça. Alors ça c'est la condition pour que l'expression fonctionne. Ça veut dire vous mettez votre expression ici, mais il faut la délimiter par un caractère de votre choix. De préférence soit dièse ou bien slash. Donc maintenant quand j'exécute pour voir le résultat, Ça m'affiche chaîne invalide parce que ma chaîne ne contient aucun a. Bon, si je mets autre chose que le a, donc ici c'est une chaîne qui contient aucun a, c'est toujours chaîne invalide. Mais quand je mets un a, dans ce cas ça me retourne chaîne valide, que ce soit à la fin, au début, au milieu, peu importe la position. Maintenant imaginez avec moi que je veux que ce a figure au début de la chaîne. Dans ce cas je mettrai le symbole circonflexe. Comme ceci. Alors là, il faut que le a figure impérativement au début de la chaîne pour que l'expression soit valide. C'est-à-dire si j'enlève le a ici et que je le mets quelque part et que je clique, ça me retourne chaîne invalide. Mais quand je le mets au début, dans ce cas ça me retourne chaîne valide. De la même manière, si je veux que le a figure à la fin, alors je vais le faire suivre par le symbole$. Donc maintenant quand j'exécute ici, si je retire le a de la fin, ça me retourne chaîne invalide. Mais quand je le remets, donc maintenant c'est bien valide. Et quand je fais ça, dans ce cas la chaîne doit commencer par un a et doit finir par le même a. Alors il faut bien que la chaîne soit égale à a pour que ça marche. Maintenant si vous voulez vérifier que votre chaîne contient un ensemble de caractères, dans ce cas on mettra quelque chose comme ça. On mettra des crochets et entre les deux on mettra des caractères souhaités, par exemple a, b, c, d, etc. Ça veut dire que la chaîne doit contenir impérativement l'un de ces caractères. A, b, c, d. J'ai pas spécifié est-ce que c'est au début ou bien à la fin. Imaginez que je veux par exemple vérifier que ma chaîne contient des caractères alphabétiques. Dans ce cas, vous imaginez qu'il faut mettre a, b, c, d jusqu'à z. Ça fait beaucoup. Alors ce qu'on va faire, c'est ça: a-z. Ça veut dire que dans ce cas, c'est un intervalle de caractères qui commence à a et qui finit à z. Maintenant, ma chaîne contient a, ça me retourne chaîne valide. Si ça contient que des chiffres par exemple, ça me retourne chaîne invalide. Il faut bien qu'il contienne un caractère alphabétique. Dans ce cas, ça me retourne chaîne valide. Bon, maintenant imaginez que j'ai fait ça avec un E majuscule. Vous avez vu que ça me retourne chaîne invalide. Ça signifie tout simplement que l'expression régulière vérifie la casse. Et si vous voulez ignorer la casse, alors après le délimiteur de fermeture de la chaîne, on mettra le symbole i. Ça veut dire que la casse maintenant est ignorée. Alors maintenant quand j'exécute, ça me retourne valide. Et si vous voulez que votre chaîne contienne tous les caractères alphabétiques minuscules, majuscules ou même des caractères numériques. On mettra quelque chose comme ça. Dans ce cas, il suffit qu'un seul caractère parmi ceux qui sont listés dans cette liste figure dans ma chaîne pour que celle-ci soit correcte. Donc si je mets par exemple que des symboles, dans ce cas chaîne invalide, mais une fois un des caractères énumérés dans la liste figure dans ma chaîne, dans ce cas ça me retourne chaîne valide. Maintenant imaginez que vous voulez que votre chaîne contienne uniquement des caractères alphabétiques ou numériques. Dans ce cas il faut mettre ça commence par et ça finit par. Le problème c'est qu'ici on a désigné un seul caractère, ça veut dire que ma chaîne contient un seul caractère qui peut être l'un de ces caractères qui sont listés ici. Regardez maintenant quand je mets par exemple le caractère A, ça me retourne valide. Mais quand je mets par exemple un 9, dans ce cas ça me retourne invalide parce que ma chaîne contient 2 caractères. Pour dire que ça contient un ou plusieurs caractères, il suffit de mettre ici le symbole+. Donc le symbole+ fait référence à l'occurrence précédente, c'est-à-dire que le caractère qui est là peut figurer une fois, deux fois, jusqu'à n fois. C'est-à-dire le minimum c'est une fois. Maintenant quand j'exécute, ça me retourne valide. Bien sûr je peux mettre autant de caractères que je souhaite pourvu que je sorte pas de cet intervalle et ça me retourne toujours chaîne valide. Et si on remplace le+ par l'étoile, Dans ce cas, on dit que ce caractère ça peut figurer au moins 0 fois et au maximum n fois. C'est-à-dire que même une chaîne vide dans ce cas ça va faire l'affaire. Quand on fait ça, ça me retourne valide. Et quand je mets n'importe quel caractère qui est contenu dans l'intervalle, ça me retourne chaîne valide. Mais quand je mets un caractère qui sort de l'intervalle, par exemple virgule, dans ce cas ça me retourne chaîne invalide. Et si on fait par exemple ceci, point plus, le point ça fait référence à n'importe quel caractère, qu'il soit un caractère de ponctuation, caractère alphanumérique, etc. Dans ce cas, ce caractère peut figurer au moins une fois et au maximum n fois. C'est comme si on dit que si l'utilisateur saisit n'importe quoi, on va l'accepter. Dans ce cas, on peut mettre vraiment n'importe quoi et ça me retourne une chaîne valide. Alors le symbole point signifie n'importe quel caractère. Maintenant imaginez que vous voulez que votre chaîne commence par a ou par b. Dans ce cas on va faire quelque chose qui ressemble à ça. Si on fait ça, ça veut dire que ma chaîne commence par un a suivi par n'importe quel caractère n'importe quel nombre de fois. Dans ce cas il suffit que la chaîne commence par le a pour que ce soit correct. Mais si on veut dire que ça peut commencer par a ou par b, dans ce cas on va faire ici la barre verticale On mettra le b et de préférence on mettra ça entre parenthèses. Dans ce cas, ça veut dire que la chaîne de caractères dans str doit commencer par le caractère a ou le caractère b et ensuite on peut mettre n'importe quel caractère n'importe quel nombre de fois. Alors j'exécute. Bon, si je mets un a avec n'importe quoi, c'est valide. Si je mets b, c'est valide aussi. Mais si je mets un autre caractère qui est différent, dans ce cas c'est pas valide. Imaginez maintenant que vous voulez fixer le nombre de fois que cette occurrence doit figurer. Dans ce cas, imaginez par exemple que je veux que le a figure 3 fois exactement dans la chaîne. On mettra donc les accolades comme ceci. On mettra la valeur 3, c'est-à-dire que ma chaîne doit contenir 3 a. Bien sûr, il faut retirer le+ pour que ça marche. Alors j'exécute, ça me retourne invalide. Quand je mets 3 a, ça me retourne valide. Avec un quatrième, c'est invalide. Avec deux seulement, c'est toujours invalide. Donc il faut impérativement avoir trois a. Et si vous voulez que le nombre de a soit compris entre un et trois, alors on va faire ceci. Donc un et trois. Le minimum c'est un, le maximum c'est trois. Donc maintenant avec trois ça marche, avec deux ça marche, avec un ça marche, mais avec quatre ça marche pas parce que je suis sorti de l'intervalle. Et si vous voulez spécifier le minimum mais pas le maximum, vous mettez juste un virgule comme ça. Ça revient à faire a+. C'est la même chose, ça veut dire que le minimum c'est 1 et le maximum n'est pas défini. Et si vous voulez limiter le maximum, par exemple pour dire 3, mais le minimum n'est pas défini, dans ce cas je vais mettre virgule 3. Ça veut dire que le minimum c'est 0, alors a peut même ne pas figurer, mais s'il figure, il doit pas se répéter plus de 3 fois. Maintenant imaginez que vous voulez exclure un caractère particulier. Par exemple, je veux dire que ma chaîne de caractères commence par tous les caractères sauf le a. Dans ce cas, voilà ce que je vais faire. Je mettrai des crochets, je mettrai le caractère a que je veux exclure et je le fais précéder par circonflexe. Et ensuite je vais mettre par exemple le point+ pour dire que ma chaîne doit commencer par n'importe quel caractère à condition que ce soit différent de a. Regardez bien ici, le symbole circonflexe il a 2 rôles. S'il est à l'extérieur des crochets, ça signifie le début de la chaîne et s'il est à l'intérieur, ça veut dire que la liste des caractères qui sont énumérés dans cet intervalle, ça sont exclus, ça veut dire ne doivent pas figurer à cet emplacement. Dans ce cas, ma chaîne doit pas commencer par A, mais ça peut commencer par n'importe quoi, mais juste après je peux mettre n'importe quel caractère, y compris le A. Bon, maintenant quand je mets par exemple ABC comme ça, c'est invalide. Mais quand je mets par exemple CBC, dans ce cas ça me donne valide. Même si je mets le A juste après, maintenant ça va marcher parce que j'ai bien spécifié que c'est la première position qui doit pas contenir le caractère A. Et si je veux dire que ma chaîne doit même pas commencer par un caractère alphabétique, je mettrai donc un z comme ça. Alors ma chaîne doit commencer par autre chose que des caractères alphabétiques minuscules. Donc quand j'exécute, bon, ça me retourne invalide. Et si je mets par exemple 1abcd, dans ce cas ça me retourne valide parce que ça commence par un caractère numérique. Maintenant on va faire un exemple, on va supposer que l'on veut saisir une URL valide. On va dire par exemple que l'on veut saisir l'adresse de Google, www.google.com. Et on va aussi dire que HTTP ou bien HTTPS est facultatif, c'est-à-dire ça peut figurer comme ça peut pas figurer. Même chose pour www. L'essentiel pour nous, c'est que la chaîne contienne google.com et il peut être préfixé par www, voire même par HTTP: voire HTTPS:. On mettra donc quelque chose qui ressemble à ça. Alors on va dire que la chaîne commence par. Bon, si je mets que google.com comme ça, tout d'abord notez qu'ici il y a le point. Et le point c'est un caractère spécial. Et pour démunir ce caractère de sa particularité au sein de l'expression régulière, je vais l'anti-slasher comme ceci. Maintenant il s'agit d'un simple point que je vais chercher. Si je fais ça, c'est comme si je dis au serveur qu'il faut autoriser uniquement les chaînes de caractères qui sont écrites comme ceci. Google.com. Exécutons pour voir. Dans ce cas, c'est valide. Mais quand je mets www, dans ce cas, c'est pas valide. Alors que je veux aussi autoriser www., mais à condition que ce soit facultatif. Je ferai donc ceci: www. Bien sûr qu'il faut pas oublier d'anti-slasher. Et juste après, je mettrai point d'interrogation. Le point d'interrogation, ça rend le caractère ou bien le motif précédent facultatif. Regardez bien que je l'ai encadré par parenthèses pour dire que c'est la même occurrence. Dans ce cas, cette occurrence, si elle figure, elle doit correspondre à ceci www. Sinon, alors il faut l'écarter carrément. Exécutons maintenant pour voir le résultat. Donc maintenant ça me donne valide. Si je la retire, ça me donne valide aussi. Mais quand je mets par exemple http: comme ceci, donc c'est invalide. Maintenant imaginez que je veux autoriser ça aussi. Http://. Alors on va opérer de la même manière. Juste avant, on va mettre http://? pour dire que c'est facultatif. Exécutons maintenant pour voir le résultat. Alors ça me donne chaîne valide. Quand je retire, c'est toujours chaîne valide. Et quand je retire ça, c'est toujours chaîne valide. Mais quand je mets autre chose, par exemple analytics.google.com, dans ce cas ça me donne chaîne invalide parce que c'est pas permis. Alors on va remettre ça. Mais comme vous le savez tous, pour se connecter à Google, on utilise pratiquement le HTTPS. Cependant, rien ne vous empêche de passer par le HTTP. Donc ce qu'on va faire, c'est qu'on va rendre le S aussi facultatif. On mettra donc ici le S et juste après point d'interrogation. Dans ce cas, le point d'interrogation qui est là, il se réfère au caractère qui est immédiatement précédent parce qu'on n'a pas mis de parenthèses. Quand j'ai mis les parenthèses, dans ce cas c'est une occurrence. Elle est entièrement concernée par le point d'interrogation qui vient juste après. Donc maintenant exécutons pour voir. Avec le S ça marche, sans le S ça marche. Notez qu'il existe des raccourcis pour spécifier certains motifs. Par exemple, au lieu de faire ceci pour dire tous les caractères alphanumériques majuscules et minuscules confondus, on peut remplacer ceci par antislash W. Dans ce cas, antislash W est un raccourci PCRE qui signifie tous les caractères alphabétiques minuscules. Minuscules, majuscules ou les chiffres, mais aussi le caractère souligné est inclus, c'est-à-dire le underscore dans ce cas il est inclus. Alors ma chaîne doit contenir impérativement un de ces caractères afin qu'elle soit valide. Il y a aussi d pour dire les caractères numériques, il y a tab pour dire les tabulations, etc. Mais en général on préfère expliciter nous-mêmes nos expressions comme on vient de le faire. Et puisqu'on y est, sachez qu'en PHP il existe des fonctions qui permettent de vérifier la validité de certains champs particuliers comme par exemple les adresses email, les URL, les adresses IP, les adresses MAC, etc. Ça veut dire au lieu d'expliciter nous-mêmes l'expression régulière, on fait appel à la fonction filter_var comme ceci. filter_var est une fonction qui retourne un résultat booléen. Il contient 2 paramètres. Le premier argument c'est la chaîne à vérifier, dans ce cas c'est str. Deuxième argument c'est une constante PHP prédéfinie qui spécifie le type du filtre à appliquer. Par exemple je vais mettre FILTER_VALIDATE_EMAIL. Dans ce cas, il faut que la chaîne de caractères respecte le format d'un email valide. Alors quand j'exécute, ça me donne invalide, mais quand je mets par exemple a@b.c, on considère que c'est un email valide. Je dis pas forcément un email correct, ça veut dire qu'il est possible que l'email n'existe pas, mais au moins sa forme est valide. Notez juste un truc, c'est que la fonction filter_var est disponible à partir de PHP 5.2. Il y a aussi le filtre -uRN qui vérifie l'URL comme on vient de le voir. Il existe aussi -uIP pour dire une adresse IP valide. Par exemple quand j'exécute, donc là c'est invalide, et quand je mets 127.0.0.1 qui est la boucle locale, dans ce cas ça me retourne valide. Et ça peut même supporter de l'IPv6. Par exemple la boucle locale en IPv6, donc ça me donne toujours chaîne valide. Mais quand je mets par exemple ici h, alors c'est chaîne invalide parce qu'on sait que ça contient des caractères en hexadécimal. Par exemple avec un f ça va marcher. Il y a aussi mac pour dire une adresse MAC valide, etc. En ce qui concerne les expressions régulières, nous nous sommes contentés de la fonction regexp_match, mais il faut savoir qu'il existe d'autres fonctions comme par exemple regexp_replace ou bien regexp_split, mais qui fonctionnent pratiquement de la même manière. Le plus important pour nous, c'est de savoir exprimer le masque ou l'expression régulière en elle-même, et cette expression est valide quelle que soit la fonction utilisée, à condition qu'elle implémente le standard PCRE. On se contente de ça pour cette séance, merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









