vérification d'adresse email avec expression régulière

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 juin 2005, 12:08

Bonjour,

je cherche à tester le format d'une adresse email avec une expression régulière

on trouve plein de petits exemples sur le net mais que je trouve souvent incomplet, qui vont par exemple autoriser ceci :

[email protected] (un "souligné' juste avant le arobase)

je souhaiterais prendre en compte tous les cas de figure possible et j'en suis arrivé à ça :

Code : Tout sélectionner

'/^[a-z][a-z0-9]*([.\-_]?[a-z0-9]*)*@[a-z0-9]+([.\-_][a-z0-9]+)*\.([a-z]{2,4})$/i'
ce qui peut sauf erreur de ma part se traduire comme ça :
/*
* 1 caractère alphabétique en début de chaine
* suivi de 0,1 ou plusieurs caractères alphabétiques/chiffre
* éventuellement suivi d'un point, tiret ou souligné, éventuellement suivi d'un ou plusieurs caractères alphabétiques/chiffre, ceci éventuellement plusieurs fois
* arobase @
* au moins 1 caractère alphabétique/chiffre
* éventuellement suivi d'un point, tiret ou souligné alors suivi d'un ou plusieurs caractères alphabétiques/chiffre, ceci éventuellement plusieurs fois
* terminée par un point et 2, 3 ou 4 caractères alphabétiques
*/
comme je ne suis pas un dieu des expressions régulières et qu'on ne peut penser à tout, j'aimerais avoir votre avis et éventuellement des contre-exemples
de plus, je ne suis pas sûr de la validité ou non de certaines formes (ex : un seul caractère devant le @)

voici le code pour tester éventuellement :
// fonction qui vérifie le format d'une adresse email
function  verifFormatEmail($email) {
	$regex = '/^[a-z][a-z0-9]*([.\-_]?[a-z0-9]*)*@[a-z0-9]+([.\-_][a-z0-9]+)*\.([a-z]{2,4})$/i';
	
	if (!preg_match($regex, $email)) {
		return "incorrecte";
	}
	return "correcte";
}

// jeu de tests
$tabemail[] = "j.company.com";
$tabemail[] = "@company.com";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]_co.uk";
$tabemail[] = "john@labo-company_co.uk";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "john@_labo.company.co.uk";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";

for ($i=0;$i<count($tabemail);$i++) {
	echo $tabemail[$i]." => ".verifFormatEmail($tabemail[$i])."<br>";
}
renvoie actuellement ceci :
j.company.com => incorrecte
@company.com => incorrecte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected]_co.uk => correcte
john@labo-company_co.uk => correcte
[email protected] => incorrecte
[email protected] => incorrecte
john@_labo.company.co.uk => incorrecte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => correcte
[email protected] => incorrecte
[email protected] => incorrecte
[email protected] => correcte
[email protected] => correcte
[email protected] => incorrecte
donc si vous aviez cinq minutes pour regarder ça et donner votre avis ce serait très sympa

merci ;)
Modifié en dernier par ouckileou le 08 juin 2005, 14:34, modifié 1 fois.

Mammouth du PHP | 19672 Messages

08 juin 2005, 12:53

Intéressant,
j'ai testé et comparé avec ce que j'utilise personnellement, ça se ressemble singulièrement à de minimes détails près. J'ai quand même voulu faire une comparaison parce que tu utilises une expression POSIX avec preg_match: j'ai fait un petit test de performance: voilà le tout (J,y ai rajouté quelques adresses valides ou non de vérification)
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title>Validation d'adresses de courriel</title>
<style type="text/css">
p {font-size: 0.8em}
</style>
</head>
<body>
<?php
// fonction qui vérifie le format d'une adresse email
function  verifFormatEmail($email)
{
    /* Fonction ouckileou */
    $regex = '/^[a-z][a-z0-9]*([.\-_][a-z0-9]+)?@[a-z0-9]+([.\-_][a-z0-9]+)*(.([a-z]{2,4}))+$/i';

    if (!preg_match($regex, $email))
    {
        return "incorrecte";
    }
    return "correcte";
}
function verifposix($email)
{
    /* Fonction Cyrano */
	$valid = "^[a-z][a-z0-9]*([_.-][a-z0-9]+)*@([a-z0-9]+([_.-][a-z0-9]+)*)+\.[a-z]{2,4}$";
    if (!ereg($valid, $email))
    {
        return "incorrecte";
    }
    return "correcte";
}

// jeu de tests
$tabemail[] = "j.company.com";
$tabemail[] = "@company.com";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]_co.uk";
$tabemail[] = "john@labo-company_co.uk";
$tabemail[] = "[email protected]_co.uk";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "john@_labo.company.co.uk";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "[email protected]";
$tabemail[] = "john@[email protected]";
$tabemail[] = "[email protected]";

$nb = count($tabemail);
echo("<p>");
$depart = microtime();
for ($i=0;$i<$nb;$i++)
{
    echo $tabemail[$i]." => ".verifFormatEmail($tabemail[$i])."<br>";
}
$fin = microtime();
echo("</p>\n");
echo("<hr />");
echo("<p>");
$depart2 = microtime();
for ($i=0;$i<$nb;$i++)
{
    echo $tabemail[$i]." => ".verifposix($tabemail[$i])."<br>";
}
$fin2 = microtime();
echo("</p>\n");
$duree1 = $fin - $depart;
$duree2 = $fin2 - $depart2;
echo("<p>Durée de traitement :<br>\nPreg_match : ". $duree1 ."<br>\nereg : ". $duree2 ."</p>\n");
?>
</body>
</html>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

08 juin 2005, 13:35

on trouve plein de petits exemples sur le net mais que je trouve souvent incomplet, qui vont par exemple autoriser ceci :

[email protected] (un "souligné' juste avant le arobase)
Cette syntaxe est autorisée. Je viens de vérifier avec [email protected]

Ca me fait penser à un site pro ou je n'a jamais pu envoyer une demande de renseignement. Il refusait le . avant l'@

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 juin 2005, 13:44

ah bon je pensais que c'était interdit...

donc on peut avoir ce qu'on veut avant le @ si je comprend bien

pour ce qui est de la fonction POSIX j'ai pris celle-là sans trop me poser de question, je sais qu'il est conseillé de privilégier une famille plutôt que l'autre mais je ne savais plus laquelle :)
je ne peux pas tester ton script où je suis Cyrano donc je ne vois pas ce que ça donne

par contre je vois qu'à la fin tu as changé {2,3} par {2,4}
la taille maximum d'une extension de nom de domaine n'est-elle pas 3 ?

Mammouth du PHP | 19672 Messages

08 juin 2005, 13:50

extension .fr valide, .com, valide, .info valide .turlututu invalide : minimum 2 maximum 4
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

08 juin 2005, 13:52

ok pour le .info :oops:

EDIT : premier message mis à jour suivant les infos récoltées, merci à vous

Eléphant du PHP | 52 Messages

08 juin 2005, 14:49

Pour ma part :

Durée de traitement :
Preg_match : 0.001098
ereg : 0.003871

donc, avantage preg :!: , presque 4x +rapide !!!

ça tombe bien, c'est c'que j'utilise le plus dans mes scripts, coup de bol

Mammouth du PHP | 19672 Messages

08 juin 2005, 14:51

mouais, et pour une raison que j'ignore, sur ma machine c'est l'inverse, le preg est 3 fois plus lent.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

08 juin 2005, 14:55

Normal, on t'a déjà dit 100 fois de changer de machine.

On sait tous que c'est le PC que ton parrain t'a offert lors de ta communion mais il va bien te falloir en changer un jour, non ?