Comment valider un Email en PHP?
Comment puis-je valider la valeur d'entrée est une adresse email valide en utilisant php5. Maintenant j'utilise ce code
function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$";
if (eregi($pattern, $email)){
return true;
}
else {
return false;
}
}
mais il montre une erreur dépréciée. Comment puis-je résoudre ce problème. S'il vous plaît aider moi.
5 réponses
vous pouvez utiliser la fonction filter_var()
, qui vous donne beaucoup d'options pratiques de validation et d'assainissement.
filter_var($email, FILTER_VALIDATE_EMAIL)
-
disponible en PHP >= 5.2.0
si vous ne voulez pas changer votre code qui dépend de votre fonction, faites:
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
Note : pour D'autres utilisations (lorsque vous avez besoin de Regex), la famille de fonctions ereg
dépréciée (fonctions de Regex POSIX) doit être remplacée par la famille preg
( fonctions de Regex PCRE ). Il ya une petite quantité de différences, la lecture du manuel devrait suffire.
mise à jour 1 : comme souligné par @binaryLV :
PHP 5.3.3 et 5.2.14 avait un bug lié à FILTER_VALIDATE_EMAIL, qui a conduit à segfault lors de la validation grandes valeurs. La solution Simple et sûre pour cela est d'utiliser
strlen()
avant defilter_var()
. Je ne suis pas sûr de 5.3.4 finale, mais il est écrit que certaines versions de 5.3.4-snapshot ont aussi été affectées.
ce bug a déjà été corrigé.
Maj 2 : cette méthode validera bien sûr bazmega@kapa
comme adresse e-mail valide, car il s'agit en fait d'une adresse e-mail valide. Mais la plupart du temps sur Internet, vous voulez aussi que l'adresse e-mail ait un TLD: bazmega@kapa.com
. Comme suggéré dans ce post de blog (lien posté par @Istiaque Ahmed ), vous pouvez augmenter filter_var()
avec un regex qui vérifiera l'existence d'un point dans la partie domaine (ne vérifiera pas valide TLD):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
comme @Eliseo Ocampos fait remarquer, ce problème n'existe qu'avant PHP 5.3, dans cette version ils ont changé le regex et maintenant il fait cette vérification, donc vous n'avez pas à.
voir les notes à http://www.php.net/manual/en/function.ereg.php :
Note:
à partir de PHP 5.3.0, l'extension regex est dépréciée en faveur de le PCRE "extension de 151940920" . L'appel de cette la fonction émettra un E_DEPRECATED avis. Voir la liste des différences pour l'aide sur la conversion à PCRE.
Note:
preg_match() , qui utilise une expression régulière compatible Perl la syntaxe est souvent une alternative plus rapide pour ereg().
C'est ancien poste mais je vais partager une ma solution parce que personne ne mentionne ici un problème avant.
nouvelle adresse e-mail peut contenir des caractères UTF-8 ou des noms de domaine spéciaux comme .live
, .news
, etc.
aussi je trouve qu'une adresse e-mail peut être sur Cyrilic et sur tous les cas standard regex ou filter_var()
échouera.
C'est pourquoi j'ai fait une solution pour elle:
function valid_email($email)
{
if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
return false;
else
{
$email=trim(strtolower($email));
if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
else
{
$pattern = '/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD';
return (preg_match($pattern, $email) === 1) ? $email : false;
}
}
}
Cette fonction fonctionne parfaitement pour tous les cas et formats de courrier électronique.
j'utilise toujours ceci:
function validEmail($email){
// First, we check that there's one @ symbol, and that the lengths are right
if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\|\")]{0,62}\"))$/", $local_array[$i])) {
return false;
}
}
if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
return false;
}
}
}
return true;
}
Restez à l'écart des solutions regex
et filter_var()
pour valider le courriel. Voir la réponse: https://stackoverflow.com/a/42037557/953833