Accueil

Traduction

Tutoriel sur Javascript

Recherche dans ce tuto

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Formulaire et contrôle 'côté client' - les regExp

Qui n'a jamais buté en essayant de remplir un formulaire. Il faut en effet que les données saisies respectent des formats; certains champs doivent obligatoirement être renseignés, il doit y avoir des cohérences entre différents champs, etc.
Les formats de saisie à respecter sont définis à partir d'expressions régulières.
Les expressions régulières (ou plus simplement regExp) sont donc utilisées par HTML et JS pour le contrôle de saisie "côté client".

Je rappelle à cette occasion qu'un contrôle de saisie "côté client ou côté navigateur" ne dispense pas d'un contrôle de saisie "côté serveur" (donc le plus souvent en PHP).
En effet un visiteur expérimenté peut neutraliser les contrôles de saisie via HTML et JS, en accédant aux outils de développement du navigateur.

Dans ce chapitre je n'évoque que le contrôle de saisie 'côté client'. Pour le contrôle de saisie "côté serveur" je vous renvoie au chapitre : contrôle par PHP des données soumissionnées

Construction d'expressions régulières

Pour créer une regExp en JavaScript il faut utiliser le constructeur RegExp ou la créer de façon littérale.

Exemples de regExp simples

Le code du document HTML

On compare à chaque fois une regExp à une chaine via la méthode test().

Pour la regExp "exp7" notez les symboles ^ et $ qui délimitent le motif ; donc la chaine qui est lui est comparée doit coïncider strictemement à ce format ni plus ni moins ; rien devant et rien derrière 'bonjour' ; par contre la comparaison est insensible à la casse grâce à l'option "i".

La dernière regExp (exp8) est créée de façon littérale ; le motif doit être entre deux / et suivi des éventuelles options.

Examinons les différents tests.
Tous les tests retournent true si concordance entre la regExp et la chaine sauf l'avant dernier (emploi de l'opérateur !) qui retourne true si divergence entre motif et chaine.

Le rendu

Vous verrez dans la troisième partie de ce chapitre qu'il existe d'autres méthodes applicables à une regExp ...

Les classes et quantificateurs

Les expressions régulières complexes sont une séquence de paires "classe-quantificateur".

Les classes

Une classe indique le ou les caractères autorisés à la saisie. On reconnait une classe car elle est délimitée par des crochets.
Une classe peut être un énumération de caractères autorisés ou un intervalle ou un mélange des deux.

le ^ en début de classe juste après le crochet signifie "tout sauf ..."
Ne pas confondre avec le ^ en début de regExp qui signifie "début de chaine".

Onb peut utiliser certains raccourcis pour exprimer les classes.

Les quantificateurs

Un quantificateur suit obligatoirement une classe et indique le nombre de caractères autorisés.
Un quantificateur est délimité par des accolades.

Formulaire de soumission sans script JS

Les attributs pattern des champs de saisie ont pour valeur une regExp avec la même syntaxe que pour une regExp définie dans le cadre d'un script.

Le code CSS & HTML d'un document PHP

Commentaire du code CSS

Emploi des pseudo-classes :invalid et :valid sur les balises input.
Donc tant que la saisie dans un champ ne correspond ni au type de champ ni au pattern la saisie est en rouge mais passe au vert dès qu'elle correspond au pattern.

Commentaire du code du formulaire

Envoi des donnés dans la même page avec la méthode POST.
Un script PHP basique dont le code :
echo "<h4>Vous êtes bien connecté</h4>";

Analyse des différentes expressions régulières du formulaire de soumission

Le pattern associé au champ "email"

La regExp est :^\w{1,}@\w{2,}\.[A-z]{2,4}$

Structure d'une adresse mail

Une adresse e-mail est un identifiant unique permettant d'envoyer et de recevoir des messages électroniques.

Le domaine contient obligatoirement un point encadré par les lettres maj. et min.

Patterns associés aux autres champs

Rendu avec le navigateur

les saisies restent alors en rouge et la soumission est bloquée.

Puis faites des saisies en respectant les consignes : les saisies passent au vert et la soumission est effective.

Formulaire de soumission avec un script JS

Dans certains cas le contrôle de saisie "côté client" ne peut se limiter à du HTML (comme dans l'exemple précédent) ; il faut complèter avec un script JS qui éventuellement interdit la soumission même si tous les champs de saisie sont passés au vert ...

Thématique

Pour vous inscrire sur un site de rencontres vous devez saisir en guise d'identifiant votre adresse mail et la confirmer puis choisir un mot de passe et le confirmer.
Le mot de passe doit contenir entre 6 et 8 caractères alphanumériques c'est à dire des lettres non accentuées et des chiffres. Les autres caractères sont bannis.
Avec HTML il est impossible de comparer les "values" de deux champs de saisie.
Il faut donc complèter le contrôle de saisie en HTML par un script qui va effectuer des comparaisons deux par deux.

Le code CSS & HTML du document HTML

J'ai donné un nom et un Id au formulaire.
Chaque champ de saisie a un nom : mail1, mail2, passe1 & passe2.
Chaque champ de saisie a l'attribut pattern

Le script

Le script est rédigé en JS moderne : utilisation de la méthode preventDefault() appliquée à l'objet de type event. Cette méthode annule le comportement par défaut du navigateur.

document.getElementById('form').onsubmit = function(event) 
{
  if (form.mail1.value == form.mail2.value 
	&& form.passe1.value == form.passe2.value) alert('soumission effectuée'); 
  else  {event.preventDefault();    alert("Erreurs de saisie !" ); }
} // fin fonction anonyme

Le script est exécuté lors de la tentative de soumission (clic sur le bouton "submit").
Dans le script JS on vérifie si on a bien saisi deux fois la même adresse mail et si on a bien saisi deux fois le même mot de passe.
Si le test retourne true : alors comportement par défaut du navigateur c'est à dire soumission.
Par contre si le test retourne false la soumission est annulée.
Il est inutile dans le script de comparer chaque "value" par rapport à une regExp puisque ce contrôle est déjà effectué via le code HTML.

Rendu avec le navigateur

Premier essai

Saisir : toto@free.fr - tata@free.fr - abcedef - bcdefg
Les adresses mail et les mots de passe sont valides ; tout est au vert mais la soumission échoue ... pourquoi ?

Deuxième essai

Saisir : toto@free.fr - toto@free.fr - sesame - sesame
Les adresses mail et les mots de passe sont valides ; tout est au vert ; la soumission réussit ... pourquoi ?

Les autres méthodes applicables à une instance de type regExp

Dans le cadre du premier script JS nous avions manipuler des regExp avec la méthode test().
Mais il existe d'autres méthodes applicables à une regExp ...

Exemple 1 : les autres méthodes

Le code du document HTML

Observez bien la regExp : seuls les formats JJ/MM/AAAA ou JJ-MM-AAAA sont autorisés pour saisir une date.

Rappel : la méthode test() retourne un booléen : true si une occurence de la regExp existe dans la chaine.
La méthode exec() retourne la première occurence de la regExp dans la chaine ou NULL.
La méthode search() retourne l'indice de la première occurence de la regExp dans la chaine OU -1 si recherche infructueuse.
La méthode match() retourne toutes les occurences de la regExp dans la chaine sous forme d'un tableau.
La méthode replace()remplace toutes les occurences de la regExp par une nouvelle occurence OU la première occurence selon l'existence (ou pas) du drapeau "g" dans la définition de la regExp.

La méthode replace() exige deux paramètres : regExp,remplacéPar.

Le rendu

Exemple 2 : alternative à replace()

Dans ce deuxième exemple je vous montre une autres solution pour des remplacements dans une chaine.
La méthode replaceAll() a été introduite avec la version ECMAScript de 2021. Donc elle n'est pas compatible avec les anciens navigateurs.

Le code du document HTML

Dans la méthode replaceAll() le 'pattern' peut être une simple chaine (et non pas une regExp). Donc il est inutile d'échapper les métacaractères (*,-,?,^,$,?, ...).
Dans une même instruction on peut chainer plusieurs fois la méthode replaceAll().

Le rendu