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. /il{2}/ sera trouvé dans "Djedaille", mais pas dans "il".
{n,} | Le caractère précédent est répété n ou plus de fois. /\d{3,}/ vérifie qu'un nombre est composé d'au minimum trois chiffres, sans limite maximum de la répétition. 123 sera correct, comme 000, et comme 123456789.
{n,m} | Le caractère précédent est répété au moins n fois, et au plus m fois. /[[:alpha:]]{4,6}/ permettra de sélectionner des chaînes de 4 à 6 caractères alphabétiques.

Exemple : répétitions délimitées
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); $txt = "Il y a bien longtemps, dans une très lointaine galaxie (36éme lune à gauche après le Djedaille's Bar)..."; htmlInfo('Recherche des consommes qui se suivent'); testerExp('/[bcdfghjklmnpqrstvwxyz]{2,}/', $txt); htmlInfo('Recherche des mots de 5 caractères ou plus'); testerExp('/\w{5,}/', $txt); htmlFin(); ?>

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}$/

Exemple : répétitions délimitées
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); htmlInfo('Un nombre entier entre 0 et 9999'); $exp = '/^\d{1,4}$/'; testerExp($exp, 123); testerExp($exp, 12345); testerExp($exp, 0); testerExp($exp, 12.34); testerExp($exp, -1234); htmlFin(); ?>

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}$/

Exemple : répétitions délimitées
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); htmlInfo('Un nombre entier entre 1 et 9999'); $exp = '/^[1-9]\d{0,3}$/'; testerExp($exp, 123); testerExp($exp, 12345); testerExp($exp, 0); testerExp($exp, 12.34); testerExp($exp, -1234); htmlFin(); ?>

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}$/

Exemple : répétitions délimitées
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); htmlInfo('Un nombre entier entre -9999 et 9999'); $exp = '/^-{0,1}\d{1,4}$/'; testerExp($exp, 123); testerExp($exp, 12345); testerExp($exp, 0); testerExp($exp, 12.34); testerExp($exp, -1234); htmlInfo('Un nombre entier entre -9999 et 9999, 0 exclu'); $exp = '/^[\-1-9]\d{0,3}$/'; testerExp($exp, 123); testerExp($exp, 12345); testerExp($exp, 0); testerExp($exp, 12.34); testerExp($exp, -1234); htmlFin(); ?>

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.

Exemple : répétitions délimitées
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); htmlInfo('Un nombre à 2 décimales entre -9999.99 et 9999.99'); $exp = '/^-{0,1}\d{1,4}$|^-{0,1}\d{1,4}\.\d{0,2}$/'; testerExp($exp, 123.45); testerExp($exp, 1234.5); testerExp($exp, -12); testerExp($exp, -0.12); testerExp($exp, 12.345); htmlFin(); ?>

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.

### Répétitions délimitées : syntaxe réduite

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}. Remarque : pour qu'il soit interprété comme métacaractère de répétition, le ? ne doit pas suivre une parenthèse ouvrante, un astérisque, un plus ou un point d'exclamation.

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}$/

Exemple : répétitions délimitées, syntaxe réduite
<?php require('bib_fonctions.php'); htmlDebut('Répétitions délimitées'); htmlInfo('Un nombre à 2 décimales entre -9999.99 et 9999.99'); $exp = '/^-?\d{1,4}$|^-?\d{1,4}\.\d{0,2}$/'; testerExp($exp, 123.45); testerExp($exp, 1234.5); testerExp($exp, -12); testerExp($exp, -0.12); testerExp($exp, 12.345); htmlFin(); ?>