PHP - Vérifier le format d'une adresse mail

Septembre 2016

Il existe plusieurs manières de déterminer si une variable contient une adresse email valide. Ces techniques ne vérifient pas si l'adresse email existe bien mais elles déterminent si la chaine contenue dans une variable respecte bien le format d'une adresse email.


I) En utilisant un filtre


En utilisant une fonction de la famille des filtres, vous pouvez vérifier qu'une adresse email est valide.
Par exemple filter_var()
Exemple:
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
//L'email est bonne
}

II) Grâce aux expressions régulières


Grâce aux expressions régulières, il est possible de vérifier si une adresse email, saisie par exemple via un formulaire, est valide.

Voici une fonction qui vérifie si une chaine de caractères est seulement une adresse email valide.

function VerifierAdresseMail($adresse)
{
//Adresse mail trop longue (254 octets max)
if(strlen($adresse)>254)
{
return '<p>Votre adresse est trop longue.</p>';
}


//Caractères non-ASCII autorisés dans un nom de domaine .eu :

$nonASCII='ďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőoeŕŗřśŝsťŧ';
$nonASCII.='ďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőoeŕŗřśŝsťŧ';
$nonASCII.='ũūŭůűųŵŷźżztșțΐάέήίΰαβγδεζηθικλμνξοπρςστυφ';
$nonASCII.='χψωϊϋόύώабвгдежзийклмнопрстуфхцчшщъыьэюяt';
$nonASCII.='ἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔ';
$nonASCII.='ὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗ';
$nonASCII.='ᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷ';
// note : 1 caractète non-ASCII vos 2 octets en UTF-8


$syntaxe="#^[[:alnum:][:punct:]]{1,64}@[[:alnum:]-.$nonASCII]{2,253}\.[[:alpha:].]{2,6}$#";

if(preg_match($syntaxe,$adresse))
{
return '<p>Votre adresse est valide.</p>';
}
else
{
return '<p>Votre adresse e-mail n\'est pas valide.</p>';
}
}

// Utilisez \w à la place de [:alnum:] si vous n'utilisez pas [:punct:] afin d'autoriser le _ puis ajoutez le . et - C'est à dire ^[\w-.]{1,64}@

Exemple d'utilisation


Après avoir récupéré le champ "adresse" d'un formulaire :

$adresse=VerifierAdresseMail($_POST['adresse']);
echo $adresse;

Explications


Les dièses (#) sont les délimiteurs de la regex.
Le signe ^ indique que la chaine doit commencer par ce qui suit, et le signe $ indique qu'elle doit se terminer par ce qui précède.
\w est une classe abrégée ( [:word:] ) qui correspond à [a-zA-Z0-9_] soit aux 26 lettres de l'alphabet en majuscules ou minuscules, les dix chiffres et underscore.
[:alpha:] (alphabet) est une classe abrégée qui correspond à [a-zA-Z] soit aux 26 lettres de l'alphabet en majuscules ou minuscules.
[:alnum:] (alpha-numérique) est une classe abrégée qui correspond à [a-zA-Z0-9] soit aux 26 lettres de l'alphabet en majuscules ou minuscules et les dix chiffres.
[:punct:] (ponctuations) est une classe abrégée qui correspond à [!"#$%&'()*+,\-./:;<=>?@[\\\]^_'{|}~] soit aux 32 caractères de ponctuation. Attention aux problèmes de sécurité éventuel si vous les autorisés.
{2,253} chaine d'une longueur de 2 à 253 octets (2 à 253 caractères ASCII)

Ce que fait le code


^[[:alnum:][:punct:]]{1,64}@ Commence (^) par au moins un caractère correspondant à les 2 classes abrégées, puis est suivi par un@.
[[:alnum:]-.$nonASCII]{2,253} 2 à 253 caractères (octets) correspondant à la classe abrégée ou un tiret(s) ou un caractère(s) non ASCII (qui utilise 2 octets chacun) . C'est le nom de domaine.
\.[[:alpha:].]{2,6}$ un point, puis deux à six lettres avec le point autorisé (ex : .com .info, .co.uk, .co.jp, .fr.st), qui finissent la chaine. C'est la tld du nom de domaine.

A voir également :

Ce document intitulé «  PHP - Vérifier le format d'une adresse mail  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.