Nous venons de voir comment utiliser les accolades { et } pour définir une répetition fixe de caractères, de classes ou de modèles.
Les accolades permettent également de définir des limites mini et maxi pour la répétition.
|
{n} |
Le caractère précédent est répété exactement n fois. |
|
{n,} |
Le caractère précédent est répété n ou plus de fois. |
|
{n,m} |
Le caractère précédent est répété au moins n fois, et au plus m
fois. |
Pour tester les répétitions avec une limite mini et une limite maxi, nous prendrons comme exemple la vérification de nombres entiers et de nombres décimaux, saisis par exemple dans une zone de formulaire, et que nous devons vérifier avant traitement.
Premier exemple : nous voulons vérifier qu'un nombre (une
quantité par exemple) est un entier compris entre 0 et 9999.
La valeur à tester doit commencer obligatoirement par un chiffre :
/^\d/
Il peut y avoir de 1 à 4 chiffres :
/^\d{1,4}/
Et c'est tout ce que nous acceptons :
/^\d{1,4}$/
Deuxième exemple : nous voulons vérifier qu'un nombre est un
entier compris entre 1 et 9999.
La valeur à tester doit
commencer obligatoirement par un chiffre de 1 à 9 :
/^[1-9]/
Il peut y avoir ensuite aucun ou au plus 3 autres chiffres
:
/^[1-9]\d{0,3}/
Et c'est tout ce que nous acceptons :
/^[1-9]\d{0,3}$/
Troisième exemple : nous voulons vérifier qu'un nombre est un entier compris entre -9999 et 9999.
Nous commencerons par le cas où les 0 sont permis. La valeur
à tester peut commencer par le signe -, soit une répetition de 0 ou
1 fois :
/^-{0,1}/
Il peut y avoir ensuite de 1 à 4 chiffres :
/^-{0,1}\d{1,4}/
Et c'est tout ce que nous acceptons :
/^-{0,1}\d{1,4}$/
Dans le cas où les 0 ne sont pas permis, la valeur à tester
peut commencer soit par le signe -, soit par un chiffre de 1 à 9 :
/^[\-1-9]/
Vous noterez qu'ici nous devons échapper le signe - par un
backslash (\) car entre des crochets ([ et ]), le signe - est un
métacaractère qui permet de définir des listes.
Il peut y
avoir ensuite aucun ou au plus 3 autres chiffres :
/^[\-1-9]\d{0,3}/
Et c'est tout ce que nous acceptons :
/^[\-1-9]\d{0,3}$/
Pour le quatrième exemple nous allons travailler avec des nombres décimaux : nous voulons vérifier qu'un nombre rentre bien dans le format -####.## et ici les 0 sont admis.
La valeur à tester peut commencer par le signe -, soit une
répetition de 0 ou 1 fois :
/^-{0,1}/
Il peut y avoir ensuite de 1 à 4 chiffres :
/^-{0,1}\d{1,4}/
On trouve après un point qui sert de délimiteur décimal.
Le caractère point (.) doit être échappé avec un backslash (\) :
/^-{0,1}\d{1,4}\./
On aura finalement la partie décimale de 2 chiffres
maximum :
/^-{0,1}\d{1,4}\.\d{0,2}$/
On pourrait s'arrêter là, mais il y a quelque chose qui va ennuyer
l'utilisateur : si il veut saisir 123 et pas de décimal, il sera
obligé de saisir 123point (123.)
Pour parfaire l'expression
régulière, nous pouvons utiliser l'opérateur ou.
Nous avons déjà construit l'expression régulière pour valider un
entier signé de 4 chiffres :
/^-{0,1}\d{1,4}$/
Il nous suffit de lier les 2 expressions :
/^-{0,1}\d{1,4}$|^-{0,1}\d{1,4}\.\d{0,2}$/
Nous verrons dans quelques instants comment simplifier cette expression avec l'utilisation de parenthèses.
IMPORTANT : chaque fois que des données viennent de
l'extérieur, une validation doit être faite avant un
traitement sur le serveur. L'utilisateur a pu oublier une saisie
obligatoire ou faire une faute ou introduire une incohérence. En
plus de ces erreurs normales car indissociables d'une activité
humaine, il faut aussi prendre en compte celles introduites avec une
volonté délibérée de nuire.
Le niveau minimal de la
validation concerne le format et le "masque de saisie" : un
nom devrait être composé uniquement de caractère alphabétique, d'un
tiret et d'un apostrophe éventuel, un nombre devrait être composé
uniquement de chiffres, avec un tiret et un point éventuel, etc.
HTML fourni divers types de zones de saisie, regroupées dans
des formulaires, pour que l'utilisateur puisse envoyer des
données à traiter au serveur. Mais HTML ne fournit aucun
mécanisme de vérification des saisies faites par l'intermédiaire
d'un formulaire.
De la même façon, les informations qui transistent
à la suite d'une URL peuvent être facilement modifiées
manuellement dans la barre d'adresse du navigateur et envoyées au
serveur.
Pour les formulaires, une première validation peut
être faite avec JavaScript du côté client, et avant envoi des
données saisies au serveur pour traitement.
Dans tous les
cas, une éventuelle première validation avec JavaScript doit
absolument être doublée par une seconde validation sur le
serveur lui même, de façon à garantir un maximum de sécurité dans
le traitement de ces informations et à éviter les tentatives de
corruption de données qui peuvent déstabiliser gravement le système
du serveur, la base de données ou votre application.
Dans
le cadre de ces vérifications et aussi bien du côte JavaScript que
du côté PHP, les expressions régulières constituent une des
meilleures armes qui soit.
Certaines limites sont très souvent utilisées, et elles peuvent être écrites avec une syntaxe réduite.
|
* |
Le caractère précédant * est répété 0 ou plusieurs fois. C'est l'équivalent de {0,}. |
|
+ |
Le caractère précédant + est répété une ou plusieurs fois. C'est l'équivalent de {1,}. |
|
? |
Le caractère précédant ? est répété 0 ou une fois. C'est
l'équivalent de {0,1}. |
Nous pouvons reprendre l'exemple précédent sur le nombre au format
-####.##. L'expression régulière était :
/^-{0,1}\d{1,4}\.\d{0,2}$/
Le test
du caractère -
-{0,1}
peut être écrit :
-?
Ce qui donne l'expression :
/^-?\d{1,4}\.\d{0,2}$/