Vérification de la syntaxe d'un courriel (email) par expressions régulières.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 973 fois - Téléchargée 29 fois

Contenu du snippet

Après avoir un peu trop bavardé sur le source
de Melnofil (http://www.javascriptfr.com/code.aspx?ID=15873)
je me résoud à ajouter mon grain de sel sur un sujet
largement débattu.
Ces sripts sont ceux que j'utilise, et j'y ai rajouté
quelques scripts utilisés par Mimata que j'ai modifiés
(interception de caractères interdits dans un champ,
modification de sa couleur de fond).
Il se reconnaîtra et pourra utiliser ces scripts en
remettant sa mise en page.

La validation de la syntaxe d'un courriel (email) vient
de l'interprétation difficile de la
RFC 822 (http://abcdrfc.free.fr/rfc-vo/rfc0822.txt)
devenue obsolète et remplacée par la
RFC 2822 http://abcdrfc.free.fr/rfc-vf/rtf/rfc2822.rtf
et la
RFC 1034 (http://abcdrfc.free.fr/rfc-vf/rfc1034.html)
Pour "Le Format des Messages de l'Internet" et
"DNS - Domain Name Server - Système de résolution des
adresses Internet numériques (pour la couche IP) et des
adresses symboliques (pour l'Homme).
Ce sont les RFC traduites en français par RFC-Editeur.org
Pour ce qui est de la RFC 2822, je n'ai pas encore
fini de l'interpréter.

Les scripts qui suivent ne tiennent pas encore compte
- des courriels noté : "Arthur, ou t'as mis le corp ?"@domaine.tld
(Pas beau la "chaîne marquée" ?)
- des courriels noté : utilisateur@[short.short.short.short]
(short = nombre 8 bits en notation décimale)
- des courriels noté : utilisateur@#nombre
(nombre = adresse IP 32 bits en notation décimale)
Et est-ce que ça sert ? Je n'en connais pas.
Mais si c'est correct, il faudra encore un peu se gratter
les boyaux de la tête.

Ici les noms de domaines s'approche de la règle RFC 2822
- 63 octets par identifiant
- 255 octets par nom de domaine entièrement qualifié (FQDN)
FQDN = <identifiant>.<identifiant>. ... .TLD
Un identifiant doit commencer par une lettre, terminer par une
lettre ou un digit, et n'avoir à l'intérieur que des lettres,
des digits, et éventuellement le caractère Hyphénation (-)
Les TLD sont des caractères de a à z ([a-z])
limités de fait, à 2 Min et 6 Max ([a-z]{2,6}).
Mais l'expression régulière, en fait dépasse les 255 fatidiques.
(63 x 4 + 4 points) + 6 caractères de TLD max = 262 caractères.

Qui peut trouver en expression régulière cette forme (255 max), sans
un test supplémentaire ?

En Rajoutant : &&(substr(sMail.lastIndexOf("@")+1).length<=255)
à function bSyntaxeEmail(sMail)

var re=/^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?![-\d])[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;
return (sMail.match(re)==sMail)&&(substr(sMail.lastIndexOf("@")+1).length<=255);

on y arrive sans trop alourdir !
Optimisé en : substr(sMail.lastIndexOf("@")).length<=256

Source / Exemple :


//********************************** Debut du fichier contact.html *************
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta http-equiv="Content-Language" content="fr" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <script type="text/javascript" src="emails.js"></script>
    <title>
      Contact par courriel
    </title>
  </head>
  <body>
    <form>
      Votre nom
      <br />
      <input type="text" name="nom" value="" size="48" maxlength="50" onkeypress="javascript:ChampOK(this.form.nom);return valid_texte(event);" />
      <br />Votre courriel
      <br />
      <input type="text" name="mail" value="" size="48" maxlength="100" onblur="javascript:minuscule(this.form.mail);" onkeypress="javascript:ChampOK(this.form.mail);return valid_mail(event);" />
      <br />Message
      <br />
      <textarea name="message" rows="5" cols="80" onkeypress="javascript:ChampOK(this.form.message);"></textarea>
      <p align="center">
        <input type="button" name="valider" value="Envoyer" onclick="javascript:verifier(this.form);" />
        <input type="reset" name="annuler" value="Annuler" />
      </p>
    </form>
  </body>
</html>
//********************************** Fin du fichier contact.html ***************

//********************************** Début du fichier emails.js ****************
// Couleur des champs mal remplis, couleur au choix, en notation HEXA
// J'utilise aussi un style="background-image: url('../images/fond_champs.gif');"
// dans mes formulaires, avec bascule, mais c'est un autre sujet.
var CouleurFAUX="#FF6500";

/*-- Fonction d'entrée pour les vérifs du formulaire ---------------------------
     Ici on peut tout modifier selon son besoin
     Passer this.form comme paramètre.
-------------------------------------------------------------------------------*/
function verifier(f)
{
  // Vérification du champs Nom
  if (f.nom.value.length==0)
    {
    ChampPasOK(f.nom);
    alert("Vous devez renseigner le champ Nom");
    f.nom.focus();
    return false;
    }
  ChampOK(f.nom);

  // Vérification du champs Message
  if (f.message.value.length==0)
    {
    ChampPasOK(f.message);
    alert("Vous n'avez pas écrit de message !");
    f.message.focus();
    return false;
    }
  ChampOK(f.message);

  // Vérification du champs Courriel (accepte un courriel vide !)
  if (f.mail.value.length!=0) // à enlever si on ne veut pas de courriel vide !
    {
    if (!bSyntaxeEmail(f.mail.value))
      {
      ChampPasOK(f.mail);
      alert("Votre mail est incorrect.\n\nVeuillez le vérifier.");
      f.mail.focus();
      return false;
      }
    if (!bDomainTLD(f.mail.value))
      {
      ChampPasOK(f.mail);
      alert("Votre mail est incorrect.\n\nVeuillez vérifier le nom de domaine.");
      f.mail.focus();
      return false;
      }
    }
  ChampOK(f.mail);

  // Affichage du message final avant enregistrement
  if(confirm("Merci "+f.nom.value+".\n\nVotre demande a été envoyée.")) f.submit();
  return false;
}

// ******* Fonction particulières, à paramétrer ********************************

/*-- Formatage des champs texte ----------------------------------------------*/
function valid_texte(evt)
{
var interdit='?$$¤*+.&~#"{}()[]_^°=^%µ!§:;.,?|\\/`';
  return InterditTouches(evt, interdit);
}
/*-- Formatage des champs Mail -----------------------------------------------*/
function valid_mail(evt)
{
var interdit='àâäãçéèêëìîïòôöõùûüñ &*?!:;,#~\'"^¨%$£?²¤§%*()[]{}<>\\|/`';
  return InterditTouches(evt, interdit);
}

//******* Fonction générales --------------------------------------------------

/*-- Vérifie la syntaxe générale d'un Email sous forme domaine en texte ------*/
function bSyntaxeEmail(sMail)
{
var re=/^[a-z\d]+((\.|-|_)[a-z\d]+)*@((?![-\d])[a-z\d-]{0,62}[a-z\d]\.){1,4}[a-z]{2,6}$/gi;
return (sMail.match(re)==sMail)&&(sMail.substr(sMail.lastIndexOf("@")).length<=256);
}
/*-- Vérifie que le Top Level Domain existe ------------------------------------
     Passer le courriel en entier. Attention les, ".eu" sont notés !
     La liste est à jour (jeudi 19 janvier 2006) et en avance pour les ".eu"
     var re= ... $/gi; doit être sur une seule ligne.
     (enlever les retour chariot, mis ici pour la présentation)
------------------------------------------------------------------------------*/
function bDomainTLD(sMail)
{
var re=/^(ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|
be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|
ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|
er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|
gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|
je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|
lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|
mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|
pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|
sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|
tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|
yt|yu|za|zm|zw|aero|arpa|biz|com|coop|edu|eu|gov|info|int|mil|museum|
name|net|org|pro|jobs|travel)$/gi;
return sMail.substr(sMail.lastIndexOf(".") + 1).match(re)!=null;
}
/*-- Fonction pour interdire la frappe de certains caractères ------------------
     (Passer l'évènement et le string des caractères interdits)
------------------------------------------------------------------------------*/
function InterditTouches(evt, sInterdit)
{
var keyCode = evt.which ? evt.which : evt.keyCode;
  if (sInterdit.indexOf(String.fromCharCode(keyCode))>=0) return false;
}
/*-- Fonction pour mettre en minuscule -----------------------------------------
     Passer l'objet (ex : f.mail ou document.forms['NomDuFormulaire'].mail)
------------------------------------------------------------------------------*/
function minuscule(o)
{
o.value=o.value.toLowerCase();
}
/*-- Fonction pour réinitialiser la couleur de l'arrière plan-------------------
     Passer l'objet (ex : f.mail ou document.forms['NomDuFormulaire'].mail)
------------------------------------------------------------------------------*/
function ChampOK(o)
{
o.style.backgroundColor="";
}
/*--Fonction pour changer la couleur de l'arrière plan ------------------------
    Passer l'objet (ex : f.mail ou document.forms['NomDuFormulaire'].mail)
------------------------------------------------------------------------------*/
function ChampPasOK(o)
{
o.style.backgroundColor=CouleurFAUX;
}
/*----------------------------------------------------------------------------*/
//******************************** Fin du fichier emails.js ********************

A voir également

Ajouter un commentaire

Commentaires

Messages postés
27
Date d'inscription
mardi 9 août 2011
Statut
Membre
Dernière intervention
21 mai 2020

Bonjour !

j'ai écrit trois fonctions javascript, pour vérifier l'intégrité d'un formulaire de mailage; Je voudrais les soumettre à votre esprit critique. Les voici :

/* object.isokform.js */

Object.prototype.isokform=function()
{
var i,element,name,value,intitule,retour,feedback,exclus,isokmail,isokform
var form=this

for(i in form.elements) if(form.elements[i].getAttribute)
{
element=form.elements[i]
name=element.getAttribute('formelement')
value=element.value=element.value.trimer()
intitule=element.getAttribute('intitule')
retour=feedback=false

if(!value) retour=intitule.veuillez('indiquer')

else if( name.match(new RegExp('nom$')))
{ exclus=value.match(new RegExp('[^a-z àâáãäåæ éèêë îïìí òóôõöøœ ùûüú ÿý çþÞßðñ \'-]','ig')); if(exclus) feedback=intitule.nepeutcontenir(exclus) }

else if(name.match(new RegExp('mail$'))) { isokmail=value.isokmail(intitule); if(typeof isokmail=='string') feedback=isokmail }

if(feedback) retour=feedback+intitule.veuillez('corriger')
if(retour) return retour
}

return true
}

/* string.isokmail.js */

String.prototype.isokmail=function(intitule)
{
var chaine=this

if(chaine.indexOf(aro)<0) return intitule.doitcomporter(une+arobase)
if(chaine.indexOf(aro)!=chaine.lastIndexOf(aro)) return intitule.doitcomporter(une+seule+arobase)
if(chaine.indexOf(space)>=0) return (le+caractere+'espace'.taguer('em')+'ne peut pas figurer'+dans+intitule).phrataguer('espace')

for(n=0; n<2; n++) { var isokmailpart=chaine.isokmailpart(n); if(typeof isokmailpart=='string') return isokmailpart }

return true
}

/* string.isokmail.js */

String.prototype.isokmail=function(intitule)
{
var chaine=this

if(chaine.indexOf(aro)<0) return intitule.doitcomporter(une+arobase)
if(chaine.indexOf(aro)!=chaine.lastIndexOf(aro)) return intitule.doitcomporter(une+seule+arobase)
if(chaine.indexOf(space)>=0) return (le+caractere+'espace'.taguer('em')+'ne peut pas figurer'+dans+intitule).phrataguer('espace')

for(n=0; n<2; n++) { var isokmailpart=chaine.isokmailpart(n); if(typeof isokmailpart=='string') return isokmailpart }

return true
}

Qu'en pensez-vous ???
Messages postés
26
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
4 octobre 2006

Réponse à guinnessboy :
il faut changer <form> par <form method="post" action="traitementformulaire.php">.
Voir à la fin de verifier(f)... le f.submit() qui executera...
if(confirm("Merci "+f.nom.value+".\n\nVotre demande a été envoyée.")) f.submit();
Mais c'est un peu en dehors du sujet.
Messages postés
7
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
8 novembre 2006

Bonjour, ce script de vérification est assez complet. J'ai cependant une question : je souhaiterai lors de la validation exécuter un fichier php qui traite les informations contenues dans le formulaire.
En fait faire la même chose qu'avec l'attribut 'action' d'un <form> lorsque que l'on utilise un bonton de type submit.
Ou dois je modifier le code ?
Merci,
Messages postés
26
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
4 octobre 2006

coucou747,
Vrai ta remarque, c'est pour cela que j'en
parle en premier dans la description.
C'est la fonction bSyntaxeEmail(sMail), qui mérite
d'être encore travaillée pour la conformité avec les RFC.
En Option, la fonction bDomainTLD(sMail)
pour les TLD, le reste c'est pour le décor !
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
pour une synthaxe d'un mail, une seule expression régulmière suffit ! t'es pas oblié de faire autant de lignes de codes...
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.