SELFHTML

Lutz Eymers
Vérifier la syntaxe d'une adresse électronique

Oage d'information: vue d'ensemble

vers le bas Lutz Eymers
vers le bas Remarques sur le sujet
vers le bas Le script
vers le bas Pour essayer

vers le bas 

Lutz Eymers

E-Mail: adresse électronique lutz@polzin.com
Homepage-URL: page en langue allemande http://ixtab.home.pages.de

Il s'agit ici d'un article traduit de l'allemand par la rédaction de SELFHTML actuel. Veuillez poser vos questions relatives à cet article uniquement à son auteur, prenant compte que celui-ci ne maîtrise peut-être pas la langue française!

nach obenvers le bas 

Remarques sur le sujet

Un problème classique recontré régulièrement lors de l'établissement de formulaires HTML est celui de la vérification de l'adresse électronique entrée par l'utilisateur. Il existe bien la possibilité de procéder côté serveur à une vérification de la validité ou de la syntaxe par script CGI. Mais il n'est pas toujours possible de mettre en œvre des programmes CGI programmés soi-même. En outre, une vérification côté client peut réduire aussi sensiblement la charge du serveur.

C'est dans ce but que j'ai écrit une fonction Javascript qui procède à une vérification de la syntaxe d'après Page en langue anglaise RFC819 (Appendix A: BNF Specification) . Le script considère une adresse électronique comme étant valide si elle répond au schéma "utilisateur @ FQDN" ou bien "utilisateur @ IPADDRESS" d'après RCF819. Quelques particularités concernant les chaînes de caractères entre guillemets (Realnames, etc.) doivent aussi être prises en compte.

Entre temps ce script est mis en œvre dans tous les formulaires HTML pour lesquels une mention d'adresse électronique est nécessaire (formulaires de commande, formulaires d'inscription etc...). Selon l'utilisation, il est possible de se servir du script en relation avec une confirmation ou une boite d'alerte JavaScript.

L'auteur vous saurait gré de l'avertir au cas où une adresse électronique valide serait considérée par erreur comme erronée par le script (seulement TCP/IP; sont bien entendu exclus les protocoles UUCP, DECnet et autres).

nach obenvers le bas 

Le script

Le script doit bien entendu être noté dans l'entête du fichier HTML dans lequel se trouve aussi l'adresse électronique à vérifier.

<script language="JavaScript1.1">
/*
  Copyright Lutz Eymers <ixtab@polzin.com>, 1997
  Polzin GmbH, Duesseldorf
*/
<!--
  function isDigit( ch )
  {
    if ( (ch >= '0') && (ch <= '9') )
      return true;
    else
      return false;
  }


  function isAlpha( ch )
  {
    if ( ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) )
      return true;
    else
      return false;
  }


  function isAlnum( ch )
  {
    if ( isAlpha( ch ) || isDigit( ch ) )
      return true;
    else
      return false;
  }


  function notIn( str1, str2 )
  {
    var i = 0;
    var j = str2.length;
    for( ; i<j; i++ )
    {
      var str3 =  str2.charAt(i);
      if( str1.indexOf( str3 ) != -1 )
        return false;
    }
    return true;
  }


  function verif_nom_utilisateur( nom_utilisateur, mustBeQuoted )
  {
    var i = 0;
    var j = nom_utilisateur.length;
    if ( nom_utilisateur.charAt(0) != '"' )
    {
      if ( (nom_utilisateur.charAt(0) <  ' ') || (nom_utilisateur.charAt(0) >  '~')
            || !notIn( mustBeQuoted, nom_utilisateur.charAt(0) ) )
        return false;
      for( i=1; i<j; i++ )
      {
        if ( ( (nom_utilisateur.charAt(i) < ' ') || (nom_utilisateur.charAt(i) >  '~')
              || !notIn ( mustBeQuoted, nom_utilisateur.charAt(i) ) )
             && ( nom_utilisateur.charAt(i-1) != '\\' ) )
          return false;
      }
    }
    else
    {
      if ( nom_utilisateur.charAt( j-1 ) != '"' )
        return false;
      for( i=1; i<j-1; i++ )
      {
        if ( ( (nom_utilisateur.charAt(i) == '\n') || (nom_utilisateur.charAt(i) == '\r')
              || (nom_utilisateur.charAt(i) == '\"') )
            && (nom_utilisateur.charAt(i-1) != '\\') )
          return false;
      }

    }
    return true;
  }


  function checkNr ( nr )
  {
    var i=0;
    var j=nr.length;

    if( j < 1 )
      return false;

    for( ; i<j; i++ )
      if( ( nr.charAt(i) < '0' ) || ( nr.charAt(i) > '9' ) )
        return false;

    return true;
  }


  function checkIpnr( ipnr )
  {
    var iL=0;
    var iC=0;
    var i=0;
    var sNr = "";

    for( ; i< ipnr.length; i++ )
    {
      if ( ipnr.charAt(i) == '.' )
      {
        if ( !iL || (iL> 3) || parseInt( sNr,10 ) > 255 )
          return false;
        iC++;
        iL = 0;
        sNr = "";
        continue;
      }
      if ( isDigit ( ipnr.charAt(i) ) )
      {
        iL++;
        sNr = sNr + ipnr.charAt(i);
        continue;
      }
      return false;
    }

    if ( parseInt( sNr,10 ) > 255 )
      return false;
    if ( ( (iC==3) && (iL>=1) && (iL<=3) ) || ( (iC==4) && (!iL) )  )
      return true;
    else
      return false;
  }


  function checkFqdn( fqdn )
  {
    var iL=0;
    var iC=0;
    var i=fqdn.length-1;

    if ( (fqdn.charAt(0) == '.') || (fqdn.charAt(0) == '-') )
      return false;
    if ( fqdn.charAt(i) == '.' )
      i=i-1;

    for( ; i>=0; i-- )
    {
      if ( fqdn.charAt(i) == '.' )
      {
        if ( iL < 2 && iC < 2 )
          return false;
        if ( fqdn.charAt(i-1) == '-' )
          return false;
        iC++;
        iL = 0;
        continue;
      }
      if ( isAlnum ( fqdn.charAt(i) ) )
      {
        iL++;
        continue;
      }
      if ( fqdn.charAt(i) == '-' )
      {
        if ( !iL )
          return false;
        iL++;
        continue;
      }
      return false;
    }

    if ( !iC || ( iL == 1 && iC < 2 ) || ( !iL && iC==1 ) ) {
      return false;
    }

    return true;

  }


  function verif_nom_hote( nom_hote )
  {
    if ( nom_hote.charAt(0) == '[' )
    {
      if ( nom_hote.charAt(nom_hote.length-1) != ']' )
        return false;
      var ipnr = nom_hote.substring( 1, nom_hote.length -1 );
        return checkIpnr( ipnr );
    }

    if ( nom_hote.charAt(0) == '#' )
    {
      var nr = nom_hote.substring( 1, nom_hote.length );
        return checkNr( nr );
    }

    return checkFqdn( nom_hote );
  }


  function verif_adresse_elec( adresse )
  {
    var status = true;
    var nom_utilisateur = "";
    var nom_hote = "";

    if ( adresse.length < 8 )
      return false;

    var separateur = adresse.lastIndexOf("@");
    if ( separateur == -1 )
      return false;

    nom_utilisateur = adresse.substring(0, separateur );
    if ( ! verif_nom_utilisateur( nom_utilisateur, "<>()[],;:@\" " ) )
      return false;

    nom_hote = adresse.substring(separateur+1, adresse.length );
    if ( ! verif_nom_hote( nom_hote ) )
      return false;

    return true;
  }


  function verif_adresse( email, allowFullname )
  {
    var existFullname = false;
    var status = true;
    var fullname = "";
    var adress = "";
    if ( email.length < 8 )
      return false;
    var emailBegin = email.indexOf("<");
    var emailEnd = email.lastIndexOf(">");

    if ( (emailBegin == -1) && (emailEnd == -1) )
      return verif_adresse_elec( email );

    if ( ( (emailBegin == -1) && (emailEnd != -1) )
        || ( (emailBegin != -1) && (emailEnd == -1) ) )
      return false;

    adress = email.substring( emailBegin+1, emailEnd );

    if ( ! verif_adresse_elec( adress ) )
      return false;

    if ( email.length == adress.length + 2 )
      return true;
    else
      if ( ! allowFullname )
        return false;

    if ( emailEnd == email.length - 1 )
    {
      if ( emailBegin == 0 )
        return true;
      if ( email.charAt( emailBegin -1 ) != ' ' )
        return false;
      fullname = email.substring( 0, emailBegin-1 );
      return verif_nom_utilisateur ( fullname, "<>()[],;:@\"" );
    }

    return false ;

  }
//-->
</script>
<script language="JavaScript1.1">
<!--
  var js11=true;
//-->
</script>
<script language="JavaScript">
<!--
  function verif_formulaire( form )
  {
    var avertissement = "";
    if ( form.email.value == "" ) {
      avertissement = "Veuillez indiquer ici votre adresse électronique!\n";
          return false;
    }
    else
    {
      if ( js11 ) {
        if ( ! verif_adresse( form.email.value, true ) ) {
          alert ("La syntaxe de votre adresse électronique est erronée!\n");
                  return false;
        } else {
          return true;
        }
      }
    }
    if ( avertissement != "" ) {
      alert( "Erreur!\n\n" + avertissement );
          return false;
    }
    return false;
  }
//-->
</script>

Un formulaire dans le fichier qui utilise ce script de vérification pourrait par exemple avoir cet aspect:

<form action="/articles/cgi-bin/javascript/verif_email/comments.pl" method="post" onSubmit="verif_formulaire( this )">
  <input type="text" size="49" name="email" maxlength="128"><br>
  <input type="submit" value="Envoyer">
</form>

Voici un court récapitulatif des fonctions définies:

Le script décompose une adresse électronique successivement dans ses composantes sémantiques et vérifie ensuite la correction syntaxique de chacune d'entre elles.

Par exemple: "Lutz Eymers" <batxi@ixtab.de>

Dans l'exemple est appelée dans un deuxième passage script une fonction mère verif_formulaire( form ), qui sert d'"intermédiaire principal" entre le code HTML et JavaScript. Dans la deuxième partie de l'exemple la fonction est appelée dans le repère d'ouverture <form>. Plus de détails sur cette façon d'exécuter une vérification JavaScript d'un formulaire avant l'envoi peuvent être trouvés dans SELFHTML dans l'exemple JavaScript Seite vérifier les saisies de formulaire.

nach obenvers le bas 

Pour essayer

Entrez une adresse électronique (et vous pouvez aussi essayer sciemment des adresses dont la syntaxe est erronée):


 

nach oben

© 2005 Seite Informations