Tester la validité d'une adresse email

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 568 fois - Téléchargée 27 fois

Contenu du snippet

Comme son titre l'indique, cette fonction teste la validité d'une adresse e-mail.

aaaaaa@bbbbbb.cccc

tout d'abord la fonction teste le fait qu'il n'y ait ni d'espace ' ' ni de double point '..'

ensuite s'il existe un arrobas et que le dernier point soit après l'arrobas et que ce dernier point n'a pas moins de 2 caractères ou plus de 4 caractères et que l'adresse est définie.

Alors on peut passer à la suite...

1 - la fonction test la partie aaaaaa et vérifie que les caractètes composant cette partie sont correct (_.-0123456789abcdefghijklmnopqrstuvwxyz)

2 - la fonction test la partie bbbbbb et vérifie que les caractètes composant cette partie sont correct (.-0123456789abcdefghijklmnopqrstuvwxyz)

3 - la fonction test la partie cccc et vérifie que les caractètes composant cette partie sont correct (abcdefghijklmnopqrstuvwxyz)

Dès qu'une erreur est détectée la fontion ne vérifie plus rien (s'il y a une erreur ce n'est pas la peine d'en chercher une autre!!!) et renvoi false.

si tout ce passe bien alors la fonction renvoi true.

Et voilà !!!

Source / Exemple :


// Début de fonction : testAdrMail
// Entrée : adrMail - (String) - Email à analysé.
// Renvoyé : true ou false - (Boolean) - Vrai si l'email est correct sinon Faux

function testAdrMail(adrMail) {

 // déclaration et initialisation des variables
 adrMailLength=adrMail.length; // longueur de la chaîne adrMail
 caractOk="_.-0123456789abcdefghijklmnopqrstuvwxyz"; // caratères corect d'une adresse mail
 var posArrobas=adrMail.indexOf('@',1); // position du premier Arrobas
 var posPoint=adrMail.lastIndexOf('.',adrMailLength); // position du dernier point
 var posCaractFaux=adrMail.indexOf('..',posArrobas+1); // position d'un caractère faux ('..' ou ' ')
 var caract=0; // caractère extrait de la chaîne adrMail (utilisée par les boucles while)
 var caractFaux=adrMail.charAt(0)+adrMail.charAt(posArrobas-1)+adrMail.charAt(posArrobas+1)+adrMail.charAt(posPoint-1);
 var posCaract=0; // position du caractère à extraire de la chaîne adrMail (utilisée par les boucles while)
 var posCaractOk=0; // position du caractère extrait de la chaîne adrMail (utilisée par les boucles while)
 var posCaractNon=-1;
 var retour=false; // l'adresse e-mail est considérée comme fausse au début

 // début du teste
 // s'il n'existe pas de caractère '..' alors on teste s'il existe un espace dans la chaîne adrMail
 if (posCaractFaux!=-1 || adrMail.indexOf(' ',0)!=-1 || adrMail.indexOf('--',0)!=-1 || adrMail.indexOf('__',0)!=-1) {
    posCaractFaux=0;
 }

 // Teste les points ou - ou _ au début de l'adrMail, autour de l'arrobas et autour du dernier point
 for (posCaract;posCaract<4;posCaract++) {
     caract=caractFaux.charAt(posCaract);
     posCaractNon=caractOk.lastIndexOf(caract,2);
     if (posCaractNon!=-1) {
        posCaractFaux=0;
        break;
     }
 }
 // si l'adresse mail contient au moins 1 caractère et qu'elle comporte un arrobas
 // et qu'elle comporte un point et que l'arrobas est avant le dernier point
 // et qu'elle ne contient pas de '..' ou d'espace et que après le dernier point il y est 2,3 ou 4 caractères
 // et qu'il n'y est pas de point autour de l'arrobas et que l'adresse ne commence pas par un point
 // Alors
 if (adrMailLength>0 && posArrobas!=-1 && posPoint!=-1 && posArrobas<posPoint && posCaractFaux==-1 && adrMailLength-posPoint-1>=2 && adrMailLength-posPoint-1<=4) {

    // extraction d'un caractère et teste s'il existe dans la chaîne "_.-0123456789abcdefghijklmnopqrstuvwxyz"
    // S'il n'existe pas alors posCaract=-1 donc au prochain 'tour' on passe aux autres boucles (qui ne s'effecturont pas)
    // Si il existe on continue la boucle jusqu'au caractère avant l'arrobas et on passe à la boucle while suivante

    adrMail=adrMail.toLowerCase();
    posCaract=0;

    while (posCaract<posArrobas && posCaractOk!=-1) {
          caract=adrMail.charAt(posCaract);
          posCaractOk=caractOk.indexOf(caract,0);
          posCaract++;
    }
    posCaract++; // on passe l'arrobas

    // sur le même principe qu'au dessus mais pour la partie entre l'arrobas et le dernier point
    // le test ce fait sur les caractères ".-0123456789abcdefghijklmnopqrstuvwxyz"
    // caractOk.indexOf(caract,1) on ne teste plus l'underscore
    while (posCaract<posPoint && posCaractOk!=-1) {
          caract=adrMail.charAt(posCaract);
          posCaractOk=caractOk.indexOf(caract,1);
          posCaract++;
    }
    posCaract++; // on passe le point

    // sur le même principe qu'au dessus mais pour la partie entre le dernier point et la fin
    // le test ce fait sur les caractères "abcdefghijklmnopqrstuvwxyz"
    // caractOk.indexOf(caract,13) on ne teste plus que des lettres
    while (posCaract<adrMailLength && posCaractOk!=-1) {
          caract=adrMail.charAt(posCaract);
          posCaractOk=caractOk.indexOf(caract,13);
          posCaract++;
    } // fin de la boucle while
    
    // durant le parcour de l'adresse mail si n'y avait pas de caractère interdit
    // posCaractOk a changer plusieurs fois de valeur mais na jamais eu la valeur -1
    // donc l'adresse est bonne
    if (posCaractOk!=-1) {
       retour=true;
    }
 }
 return retour; // renvoi le résultat (true ou false)
} // fin de la fonction

Conclusion :


Que pensez-vous de ma première fonction?

A voir également

Ajouter un commentaire

Commentaires

spidermario
Messages postés
130
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
14 mars 2009

Le plus simple que j'ai pu faire est
function isValidEMailAddress(e)
{
return e.match(/\w+@[A-Za-z-]{2,}\.[A-Za-z]{2,3}/);
}
cs_sivispacem
Messages postés
26
Date d'inscription
vendredi 26 avril 2002
Statut
Membre
Dernière intervention
4 octobre 2006

C'est un peu fastidieux comme méthode et pas suffisant.
A mon avis il vaut mieux créer un modèle, et refuser ce qui sort du modèle.
Exemple : (insufisant pour la RFC 2822)
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);
}

Pour les règles, consulter 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).
GilDev1
Messages postés
6
Date d'inscription
jeudi 25 mai 2006
Statut
Membre
Dernière intervention
25 mai 2006

sa marche pas du tout BRAVO
zut69
Messages postés
356
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
26 juin 2012
1
Bonjour,
J'ai un problème: je voudrais inclure ton super code pour l'inscription à l'espace membre de mon site, mais je sais pas trop comment l'inclure au code ci-dessous,
dois-je l'insérer dans cette page? si oui ou? sinon, sur comment faire ma page? comment modifier celle-ci?

Bon, voici mon code:
<?PHP
include ("noms_utis.inc.php");

$titre = "Site à accès protégé";

if ($nom "" || $passe "")
{ include ("html.inc.php");
echo "Site à accès protégé
";
echo "<FORM ACTION=$PHP_SELF METHOD='POST'>";
echo "Identifiez-vous, svp :";
echo 'Votre Email : Mot de passe : ';
echo '';
echo '';

echo "Si vous n'êtes pas inscrits, cliquez ici.";
echo '</FORM></HTML>';
}
else
{ $fp = fopen (UTILISATEURS, "r");
while ($z = fgets($fp, 1000))
{ $q = explode(",", $z);
if ($nom $q[0] && md5($passe) rtrim($q[1]))
{ fclose($fp);
echo "Bienvenue dans mon site Web
";
echo "blablablablablablablablablablablablabla";
echo "blablablablablablablablablablablablabla";
exit;
}
}
echo "Mauvais login ou mauvais mot de passe, si vous n'êtes pas inscrit, inscrivez-vous !
";
fclose($fp);
}
?>

Merci
François
apxa
Messages postés
188
Date d'inscription
mercredi 15 mai 2002
Statut
Membre
Dernière intervention
25 avril 2009

avec une reduction au max des mise a la ligne et des accolades on obtient:
36 lignes pour les deux.
1605 caractères pour le tiens
1341 caractère pour le mien
sur des grosses quantitée de mail a vérifier (cad > 1000) on commence a voir des différences de rapidités:
< 1000 mail : +/- egal
> 1000 mail : le tiens plus rapide
voila voila...
conclusion les deux se valent pour une utilisation classique.
Bon travail :)

ps: Tu peux voir dans mon zip.

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.