Dans cette leçon, nous allons découvrir les différents caractères d’option disponibles et apprendre à les utiliser intelligemment.
Présentation des options des regex
Les options, encore appelées modificateurs, sont des caractères qui vont nous permettre d’ajouter des options à nos expressions régulières.
Les options ne vont pas à proprement parler nous permet de chercher tel ou tel caractère mais vont agir à un niveau plus élevé en modifiant le comportement par défaut des expressions régulières. Elles vont par exemple nous permettre de rendre une recherche insensible à la casse.
On va pouvoir facilement différencier une option d’un caractère normal ou d’un métacaractère dans une expression régulière puisque les options sont les seuls caractères qui peuvent et doivent obligatoirement être placés en dehors des délimiteurs du masque, après le délimiteur final.
Liste des options disponibles et exemples d’utilisation
Certaines options sont complexes dans leur fonctionnement, peu utilisées ou ne sont pas toujours compatibles. Le tableau suivant ne présente que les options toujours disponibles et les plus utiles selon moi.
Option | Description |
---|---|
i | Rend la recherche insensible à la casse |
m | Par défaut, les expressions régulières considèrent la chaine dans laquelle on fait une recherche comme étant sur une seule ligne et font qu’on ne peut donc utiliser les métacaractères ^ et $ qu’une seule fois. L’option m permet de tenir compte des caractères de retour à la ligne et de retour chariot et fait que ^ et $ vont pouvoir être utilisés pour chercher un début et une fin de ligne |
s | Cette option permet au métacaractère . de remplacer n’importe quel caractère y compris un caractère de nouvelle ligne |
x | Permet d’utiliser des caractères d’espacement dans nos masques sans que ceux-ci soient analysés afin de clarifier nos masques. Attention cependant à ne pas ajouter d’espace dans es séquences spéciales d’un masque, comme entre un « ( » et un « ? » par exemple |
u | Cette option permet de désactiver les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec le langage Perl. Cela peut être très utile dans le cas où on souhaite exporter nos regex |
Voyons immédiatement comment utiliser ces options en pratique. Notez qu’on va tout à fait pouvoir ajouter plusieurs options à un masque.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php $masque1 = '/pie/'; $masque2 = '/pie/i'; $masque3 = '/e$/'; $masque4 = '/e$/m'; /*On utilise des guillemets ici afin que le PHP interprète bien *le retour à la ligne \n*/ $chaine = "Je suis Pierre\nJ\'ai 29 ans"; echo 'Chaine de recherche : "' .$chaine.'".<br>'; if(preg_match($masque1, $chaine)){ echo '"pie" trouvé dans la chaine<br>'; }else{ echo '"pie" non trouvé dans la chaine<br>'; } if(preg_match($masque2, $chaine)){ echo '"pie" (en min ou en maj) trouvé dans la chaine<br>'; }else{ echo '"pie" (en min ou en maj) non trouvé dans la chaine<br>'; } if(preg_match($masque3, $chaine)){ echo '"e" trouvé en fin de chaine<br>'; }else{ echo 'Pas de "e" trouvé en fin de chaine<br>'; } if(preg_match($masque4, $chaine)){ echo '"e" trouvé en fin de ligne ou de chaine<br>'; }else{ echo 'Pas de "e" trouvé en fin de ligne ou de chaine<br>'; } ?> <p>Un paragraphe</p> </body> </html>
Pour bien comprendre ce code, il faut déjà noter qu’on utilise ici un caractère de nouvelle ligne en PHP dans notre chaine (\n
). Pour que ce caractère soit correctement interprété par le PHP, on entoure ici notre chaine de guillemets droits plutôt que d’apostrophes.
Je vous rappelle en effet que la grande différence entre les apostrophes et les guillemets lors de leur utilisation avec les chaines de caractères en PHP réside dans ce qui va être interprété ou pas par le PHP.
En utilisant des apostrophes, le PHP considèrera le contenu de la chaine comme du texte (à l’exception des caractères \\
et \'
qui vont nous permettre d’échapper un antislash et un apostrophe) tandis qu’en utilisant des guillemets le PHP interprètera les noms de variables et les séquences d’échappement comme \n
par exemple.
Notre premier masque nous permet ici de chercher la séquence « pie » en minuscules dans notre chaine. Celle-ci n’est pas trouvée.
Notre deuxième masque utilise cette fois-ci l’option i
qui rend la recherche insensible à la casse. Ce masque va donc nous permettre de trouver n’importe quelle séquence « pie » en minuscules ou en majuscules.
Notre troisième masque cherche le caractère « e » en fin de chaine. En effet, comme l’option m
n’est pas présente, PCRE considèrera que notre chaine est sur une seule ligne.
Notre quatrième masque utilise l’option m
qui va changer le comportement par défaut de PCRE qui va alors tenir compte des retours à la ligne (\n
) et des retours chariots (\r
) dans notre chaine. Ce masque nous permet de cherche le caractère « e » en fin de ligne ou de chaine.
Conclusion sur les expressions régulières en PHP
Nous avons couvert la majorité des concepts relatifs à l’utilisation des expressions régulières en PHP et sommes désormais capables de créer des masques de recherche puissants qui vont nous permettre d’analyser le contenu d’une chaine.
Une nouvelle fois, les expressions régulières vont s’avérer particulièrement utiles lorsqu’on voudra vérifier la forme des données envoyées par les utilisateurs. Elles vont par exemple nous permettre de nous assurer qu’un utilisateur a bien exactement envoyé une séquence de 10 chiffres lorsqu’on lui a demandé son numéro de téléphone, ou que le mot de passe choisi par l’utilisateur lors de son inscription contient au moins 8 caractères dont un caractère spécial, une majuscule et un chiffre par exemple.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <form action='cours.php' method='post'> <label for='pass'>Choisissez un mot de passe.</label> <input type='password' name='pass' id='pass'> <br> <p>Note : Le mot de passe doit possèder au moins 8 caractères dont au moins une majuscule, un chiffre et un caractère spécial</p> <br> <input type='submit' value='Envoyer'> </form> <?php $m = '/^\S*(?=\S{8,})(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$/'; if(isset($_POST['pass'])){ if(preg_match($m, $_POST['pass'])){ echo 'Le mot de passe choisi convient'; }else{ echo 'Le mot de passe choisi ne répond pas aux critères'; } } ?> <p>Un paragraphe</p> </body> </html>
Ici, on commence par créer un formulaire qui demande un mot de passe aux utilisateurs en utilisant la méthode post
et en envoyant les données reçues vers la page courante pour traitement avec action='cours.php'
.
Les données envoyées vont être automatiquement stockées dans la superglobale $_POST
et on va pouvoir y accéder côté PHP en indiquant $_POST['pass']
.
Côté traitement PHP, on s’assure déjà qu’une valeur a bien été envoyée grâce à la ligne if(isset($_POST['pass']))
. Si une valeur a bien été envoyée, le test de notre condition est validé et on rentre dedans. Dans le cas contraire, le test échoue et rien n’est affiché.
On utilise ensuite un masque plus complexe que ce qu’on a pu voir jusqu’à présent et qui nous permet de tester qu’une chaine ne contient pas d’espace et contient bien au moins 8 caractères avec au moins une majuscule, un chiffre et un caractère spécial.
Pour cela, on commence par utiliser ^\S*
et \S*$
qui indique qu’on attend n’importe quel caractère à l’exception d’un caractère blanc 0 fois ou plus en début et en fin de chaine.
Ensuite, on utilise des assertions qui, je vous le rappelle, ne sont pas capturantes par défaut :
- L’assertion
(?=\S{8,})
permet de s’assurer que la chaine reçue fait au moins 8 caractères ; - L’assertion
(?=\S*[A-Z])
permet de s’assurer que la chaine reçue possède au moins une lettre appartenant à l’intervalle de classe[A-Z]
, c’est-à-dire au moins une lettre majuscule ; - L’assertion
(?=\S*[\d])
permet de s’assurer que la chaine reçue possède au moins un chiffre ; - L’assertion
(?=\S*[\W])
permet de s’assurer que la chaine reçue possède au moins un caractère spécial.
Encore une fois, ce masque est beaucoup plus complexe que tout ce qu’on a pu voir jusqu’à présent et nous commençons à utiliser différentes fonctionnalités du PHP ensemble dans cet exemple.
C’est donc tout à fait normal si cela vous semble « impossible à réaliser seul » de premier abord. Essayez simplement pour le moment de prendre un maximum de temps pour bien comprendre les différentes parties du masque ici et le reste viendra avec la pratique.