J'ai dit que l'on pouvait faire ce que l'on appelle des contrôles de
premier niveau. Ce sont des vérifications de cohérence intra
champ: un champ montant ne contient pas de lettres, un code postal français
est bien sur 5 caractères etc.. ou bien tout simplement vérifier
que les champs obligatoires sont bien saisis voire remplis. On peut même
vérifier un champ par rapport à une liste de valeurs, pour
peu qu'on l'ait en local. On peut aussi envisager des contrôles inter-champs
mais on réserve en général cela au serveur.
Tout cela est dans les compétences de JavaScript.
Je vais poursuivre l'exemple de la vérification d'une adresse e-mail,
ce cas nous permettant d'envisager des contrôles dont certains ne
sont possibles que sur le serveur. Je noterai "e-mail" en lieu
et place d' "adresse e-mail"
1º) Le b-a-ba de l'internet nous apprend qu'une e-mail sans le arobas
n'est pas une e-mail ! On peut donc déjà rechercher la présence
de "@" dans la chaîne de caractères.
(note: dans tous les exemples szEmail sera la chaîne contenant
ce que l'on souhaite être une e-mail.)
On utilise szEmail.indexOf( "@") qui :
* renvoie (-1) si la chaîne n'est pas trouvée et on
est alors sur que l'adresse fournie est invalide,
* et retourne 0 si @ a été trouvé, nous ne
sommes pas beaucoup plus avancé.
2º) On va pousser un peu plus loin l'analyse en prenant les règles
syntaxiques de fabrication d'e-mail. C'est une chaîne de caractères
qui:
a) commence par un caractère alphabétique ;
b) puis un nombre indifférent de caractères alphanumériques
ou non: '.', '-' ou '_', mais pas de caractères accentués
; la séquence '..' étant interdite.
c) le fameux arobas @ ;
d) des caractères alphanumériques divers et variés
;
e) se termine par un point suivi de deux ou trois caractères alphabétiques.
Nous allons pour la première fois valider les e-mail dont la structure
est comme ceci xxxxxx.yyyyy@zzzz.www. Nous étudierons plus tard
les cas plus généraux.
On pourrait faire cela avec des recherche de caractères, je ne vais
pas explorer cette piste là car elle est trop onéreuse en
développement, en maintenance et en exécution.
Il y a une autre solution qui est elle aussi coûteuse en réflexion
mais elle a le mérite d'être rapide à l'exécution
et élégante. L'élégance fait aussi partie pour
moi de la programmation. Cette solution fait appel aux expressions régulières,
les regexp.
Je ne vais pas faire un exposé sur la syntaxe des expressions régulières,
et plutôt que de décrypter une regexp, nous allons construire
celle répondant aux critères a) à e) précédents.
Une regexp est une chaîne de caractère représentant
un modèle dont les délimiteurs sont par habitude des '/'
et de paramètres d'options: regexp=/modele/options.
Allons-y, nous nous occuperons de la casse des caractères à
la fin.
a) commence par au moins un caractère alphabétique:
Un caractère alpha, donc compris entre 'a' et 'z', s'indique par
'[a-z]' et pour signifier qu'il doit être au début
de la chaîne on met '^'.
-> regexp = /^[a-z]/
b) puis un nombre indifférent de caractères alphanumériques
ou non même, mais pas de caractères accentués:
On va retrouver à peu près la même chose en élargissant
le champ des caractères autorisés: [a-z0-9_-] signifie de
a à z de 0 à 9 et le tiret ou le souligné. Ce qui
nous donne, le + signifiant qu'il y en a au moins 1, il ne s'applique qu'au
groupe immédiatement précédent:
-> regexp = /^[a-z][a-z0-9_-]+/
Le '.' est spécial c'est un séparateur de séquences,
il peut être présent plusieurs fois mais jamais deux consécutifs.
Pour le repérer dans un regexp on l'échappe, car le '.' est
un caractère spécial de repérage : on écrit
'\.' On peut aussi le mettre entre crochets dans lesquels il perd son pouvoir
magique '[.]. Il doit donc être suivi par une séquence d'au
moins un des caractères [a-z0-9_-].
Voilà où nous en sommes:
-> regexp = /^[a-z][a-z0-9_-]+\.[a-z0-9_-]+/
ou regexp = /^[a-z][a-z0-9_-]+[.][a-z0-9_-]+/
c) le fameux arobas @:
On indique tout simplement '@'. Pour repérer un caractère
non spécial, on l'indique tout simplement
-> regexp =/^[a-z][a-z0-9_-]+\.[a-z0-9_-]+@/
d) des caractères alphanumériques divers et variés:
Nous sommes en terrain connu [a-z0-9_-]+
-> regexp =/^[a-z][a-z0-9_-]+\.[a-z0-9_-]+@[a-z0-9_-]+/
e) se termine par un point suivi de deux ou trois caractères alphabétiques:
On sait repérer le point '\.'. On sait aussi repérer les
caractères alphabétiques '[a-z]'. Pour signifier que l'on
en accepte deux ou trois on ajoute {2,3}: '[a-z]{2,3}'.
Comme nous avons utilisé '^' pour indiquer que la coïncidence
devait se faire au début, on met '$' pour imposer que la chaîne
se termine par ce modèle.
Ce qui nous donne:'([a-z]{2,3})$'.
-> regexp =/^[a-z][a-z0-9_-]+\.[a-z0-9_-]+@[a-z0-9_-]+\.([a-z]{2,3})$/
ou regexp =/^[a-z][a-z0-9_-]+[.][a-z0-9_-]+@[a-z0-9_-]+[.]([a-z]{2,3})$/
Pour accepter les caractères sans distinction de majuscules/minuscules
ou ajoute 'i' à la fin et voilà enfin notre expression régulière
complète:
-> regexp =/^[a-z][a-z0-9_-]+\.[a-z0-9_-]+@[a-z0-9_-]+\.([a-z]{2,3})$/i
Je trouve que cela fait un peu Merlin l'enchanteur mais vous pouvez essayer.
Pour aller plus loin, j'y reviendrai et vous pouvez utiliser les deux URL
ci-dessous.
Comme il y aura des questions sur le sujet, voici un excellent tutorial
sur ce sujet : www.siteexperts.com. Vous trouverez sur ce site un petit
script permettant de tester ces propres regexp (il suffit de l'adapter).
Et il y a aussi une excellente traduction d'un article américain
sur www.phpinfo.net (avec l'autorisation de son traducteur).
Daniel Lucazeau
Ajornet.com
Développeur informatique
Tous droits réservés - Reproduction même
partielle interdite sans autorisation préalable
|