256 votes

Comment valider une adresse e-mail en PHP

J’ai cette fonction pour valider une adresse de Courriel :

Est-ce OK pour vérifier si l’adresse de courriel est valide ou non ?

646voto

PeeHaa Points 31941

La méthode la plus simple et la plus sûre façon de vérifier si une adresse email est bien formé est d'utiliser l' filter_var() fonction de:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

En outre, vous pouvez vérifier si le domaine définit un MX le dossier:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

Mais ce n'est toujours pas garantie que la poste existe. La seule façon de le savoir est par l'envoi d'un mail de confirmation.


Maintenant que vous avez votre réponse facile n'hésitez pas à lire sur le sujet de l'email de validation d'adresse si vous tenez à le savoir, ou sinon il suffit d'utiliser la réponse rapide et de progresser. Sans rancune.

Pour tenter de valider une adresse e-mail à l'aide d'une expression régulière est un "impossible" de la tâche. J'irais jusqu'à dire que cette regex vous avez fait est inutile. Il y a trois rfc concernant emailaddresses et écrire une regex pour attraper mal emailadresses et et en même temps de ne pas avoir de faux positifs est quelque chose qu'aucun mortel ne peut le faire. Consultez cette liste pour des tests (à la fois échoué et réussi) de l'expression régulière utilisée par PHP filter_var() fonction.

Même intégré dans les fonctions de PHP, par courriel les clients ou les serveurs ne pas l'obtenir. Toujours dans la plupart des cas filter_var est la meilleure option.

Si vous voulez savoir ce que les regex modèle de PHP (pour l'instant) pour valider les adresses e-mail voir le source PHP.

Si vous voulez en savoir plus sur les adresses e-mail, je vous suggère de commencer à lire les specs, mais je dois vous avertir qu'il n'est pas facile à lire par un effort:

Notez que filter_var() est comme déjà indiqué uniquement disponible depuis PHP 5.2. Dans le cas où vous voulez qu'il fonctionne avec les versions précédentes de PHP, vous pouvez utiliser les regex en PHP:

<?php

$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';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

P. S. Une note sur l'expression régulière pattern utilisé ci-dessus (à partir de la source en PHP). Il semble qu'il y a un copyright de Michael Rushton. Comme l'a déclaré: "n'hésitez pas à utiliser et redistribuer ce code. Mais gardez cela à l'avis de droit d'auteur."

52voto

Cameron Martin Points 826

Vous pouvez utiliser filter_var pour cela.

12voto

Fluffeh Points 21893

Je pense que vous pourriez être mieux lotis utilisant intégré filtres - PHP dans ce cas précis :

Elle peut retourner une valeur true ou false lorsqu’il est fourni avec la `` param.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X