Actualites  Archives
 Inscription | Plan du site | 3  visiteurs actifs  
  
     A la Une
  Actualités
  Dossiers
  Coin Technique
  Annonces Web
  Référencement

     Diagnostic
  Popularité Site Web
  Positionnement Moteur
  WebPage Alerte
  Positionnement Google

     Archives
  Sélection
  Expérience qui parle
  Internet quotidien
  Tous les dossiers

     Services
  Communiqués de Presse

     Contact
  Nous contacter
  La protection des données personnelles

     Technique
  Merise

     Login
   
    
Inscription

Mot de passe oublié?

   Sondage
Les points que vous souhaitez voir traiter à l'avenir ?
5%Actualité
28%Documentation
53%Exemples de sources
3%Liste de liens
11%Revue logiciels

   Sondage
Vous vous intéressez plutôt à
77%Programmation
11%Système
8%Logiciel
5%Matériel

   Sondage
votre niveau technique ?
15%Amateur
46%Débutant
32%Professionnel
7%Expert

     Rechercher
    
   

 Coin Technique


Les expressions régulières

Dans le précédent article j'ai abordé les différences entre les parties serveur et client de la programmation des pages web.
Dans celui-ci je vais m'attacher à ce qui se passe sur le poste client avant que la page ne revienne sur le serveur.

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

 Imprimer Donner votre avis

Les réactions


Modification
par [27.04.2004 11:37 - Tequila]
bravo pour l'article
moi j'utilise plutot cette expression régulière inspirée de votre exemple qui me permet plus de souplesse dans mon cas d'utilisation.
var regexp=/^[a-z]([a-z0-9_-] \.?) @([a-z0-9_-] \.) ([a-z]{2,3})$/i

Good!
par [08.03.2004 16:40 - vincne]
Good!

Quelques défauts
par [26.02.2004 10:40 - nekikool]
L'expression n'est pas parfaite, par exemple elle impose d'avoir un [ . ] dans la première partie du mail ce qui est assez gênant..
Ceci dit l'explication pas à pas est bien sympa et les liens sont bons, d'ailleurs le ptit JS fournit pour tester les regExp ( http://www.siteexperts.com/tips/functions/ts23/siteexperts_regexp.zip )
est très bien.

 
 

Sam-Mag - Un site du réseau ACORUS 1996-2007
© Copyright ACORUS All rights reserved.- Mentions légales

Ce site respecte la loi Informatique et Libertés. Pour en savoir plus sur la protection des données personnelles, cliquez

 
Webmaster