Télécharger
Noter:
Ajouté le 2021-12-02
Visionné 4884 fois
5/5 (3)
Vérifier une adresse mail en PHP
Description
Ce script simple (quand on sy connait un minimum en expression régulière), permet de vérifier si une adresse mail est correcte, souvent utilisé lors de l'envoi d'un
formulaire de contact ou de la
création d'un compte membre en PHP, valider un mail est important pour s'assurer que l'utilisateur à correctement renseigné le champ du formulaire.
Bug solutionné:
- les adresses avec plusieurs points de suite ne sont plus acceptées
Exemple:
mon@email.........com =>
mon@email.com
Nouveautés:
- La regex accepte désormais les adresses mail avec ou sans points, comme "monemail@domaine.tld" ou "mon.email.avec.points@mon.domaine.tld"
- Optimisation avec ajout du marqueur "i" qui indique "insensible à casse", les adresses avec majuscules et minuscules sont acceptées (mOn@Email.com), pensez à les passer à strtolower() ensuite
Explications:
Intéressons-nous a
preg_match (regex - regular expressions)
preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine);
le ^ du début permet de vérifier que la chaine commence par ce qu'on demande ensuite, soit: [a-z0-9_-], ce qui veut dire que le début de l'adresse mail peut commencer par des lettres minuscules et/ou majuscules (Option de recherche: i qui permet de rechercher des caractères minuscules ou majuscules) avec des chiffres, un underscore et/ou un tiret.
Au cas où le mail serait constitué d'un ou plusieurs points (ex: mon.super@e.mail.com), on inspecte avec ? (point d’interrogation) (veut dire: "peut être répété et peut ne pas y être aussi") ceux qu'il y a entre parenthèses:
((\.[a-z0-9_-]+){1,})?
En gros cela veut dir: ".duTexteEtDesChiffresAvec_et-" qui peut se répéter à l'infini grâce à {1,} qui veut dire "1 fois ou plus".
Ensuite on vérifie si il y a le fameux
arobase @
on revérifie si la continuité du mail contient là encore des chiffres et/ou des lettres et/ou un tiret et/ou un underscore (avec
[a-z0-9_-]), vous remarquerez la présence d'un signe + (plus) après notre classe
[a-z0-9_-], cela signifie qu'il faut au moins 1 caractère ou plusieurs, par exemple:
a@a.aa fonctionnera mais
@a.aa ne fonctionnera pas.
Ensuite, nous avons un anti-slash suivi d'un point:
., cela signifie que nous voulons un point (.), il faut l'échapper avec un \ car le point est un métacaractères et sans le \ il veut dire "tous les caractères".
Et pour finir, la dernière classe
[a-z] suivie de
{2,} qui permet de vérifier la présence d'une chaine de lettres d'une longueur minimum de 2 à 30 (Cette partie sera l'extension du nom de domaine de l'adresse mail, par exemple: fr, com, net, xyz...).
J'ai mis 2,30 car il existe maintenant des extensions de nom de domaine extravagants dont on ne sais pas jusqu'à combien de caractères ils vont s'arrêter!
à ne pas oublier le signe dollar ($) qui dit
"la chaine doit se terminer ainsi" et ne rien avoir d'autre après.
$chaine = "nom.prenom@email.com";
if(!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine)) {
echo "Le mail est incorrect !";
} else {
echo "Le mail est correct !";
}
//on peut optimiser l'écriture en remplaçant [a-z0-9_-] par [-\w], \w étant égal à "0-9a-z_" (j'ai gardé [a-z0-9_-] pour l'exemple car c'est plus simple à comprendre)
//encore plus compliquée à comprendre quand on est novice, l'écrire avec une référence arrière pour éviter de réécrire les classes (\1 fait référence à "((\.[-\w]+){1,})")
preg_match("#^[-\w]+((\.[-\w]+){1,})?@[-\w]+\1?\.[a-z]{2,}$#i",$chaine)
On peut également en faire une fonction:
function verifmail($mail){
if(preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$mail)) {
return true;
} else {
return false;
}
}
if(!verifmail("le@mail.com")) {
echo "Le mail est incorrect !";
} else {
echo "Le mail est correct !";
}
Commentaires
Daft le 26 Décembre 2013 à 14:03
Merci pour ton script
Retour à la liste des scripts