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

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

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.