Comment puis-je valider la valeur d'entrée est une adresse e-mail valide 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 obsolète. Comment puis-je résoudre ce problème. Aidez-moi, s'il vous plaît.
Vous pouvez utiliser la fonction filter_var()
, qui vous offre de nombreuses options pratiques de validation et de désinfection.
filter_var($email, FILTER_VALIDATE_EMAIL)
Disponible en PHP> = 5.2.0
Si vous ne voulez pas changer le code qui s'appuie sur votre fonction, faites simplement:
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
Remarque : Pour les autres utilisations (où vous avez besoin de Regex), la famille de fonctions obsolète ereg
(Fonctions POSIX Regex) doit être remplacée par la preg
famille ( fonctions PCRE Regex ). Il y a un peu de différences, la lecture du manuel devrait suffire.
Mise à jour 1 : Comme indiqué par @ binaryLV :
PHP 5.3.3 et 5.2.14 avaient un bug lié à FILTER_VALIDATE_EMAIL, ce qui entraînait un segfault lors de la validation de grandes valeurs. La solution de contournement simple et sûre consiste à utiliser
strlen()
avantfilter_var()
. Je ne suis pas sûr de la version 5.3.4 finale, mais il est écrit que certaines versions d’images instantanées 5.3.4 ont également été affectées.
Ce bug a déjà été corrigé.
Update 2 : Cette méthode validera bien sûr bazmega@kapa
en tant qu'adresse e-mail valide car il s'agit en fait d'une adresse e-mail valide. Mais la plupart du temps sur Internet, vous souhaitez également que l'adresse e-mail ait un TLD: [email protected]
. Comme suggéré dans ce article de blog (lien posté par @ Istiaque Ahmed ), vous pouvez augmenter filter_var()
avec une regex qui vérifie l'existence d'un point dans la partie de domaine (ne vérifiera pas si un valide TLD):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
Comme @ Eliseo Ocampos a souligné, ce problème n'existe qu'avant PHP 5.3, dans cette version, ils ont changé la regex et maintenant, il vérifie tu n'as pas à.
Voir les notes sur http://www.php.net/manual/en/function.ereg.php :
Note:
A partir de PHP 5.3.0, l'extension regex est déconseillée au profit de extension PCRE . L'appel de cette fonction émettra un avis E_DEPRECATED. Voir la liste des différences pour obtenir de l'aide sur la conversion en PCRE.
Note:
preg_match () , qui utilise une syntaxe d'expression régulière compatible Perl, constitue souvent une alternative plus rapide à ereg ().
Ceci est un ancien post mais je vais partager une de mes solutions car personne ne mentionne ici un problème auparavant.
La nouvelle adresse électronique peut contenir des caractères UTF-8 ou des noms de domaines spéciaux tels que .live
, .news
etc.
De plus, je trouve que certaines adresses électroniques peuvent être sur Cyrilic et que dans tous les cas, les expressions rationnelles standard ou filter_var()
vont échouer.
C'est pourquoi j'ai créé une solution pour cela:
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;
}
Utilisation:
var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("[email protected]", $multipleValidations); //true
Éloignez-vous des solutions regex
et filter_var()
pour la validation des e-mails. Voir cette réponse: https://stackoverflow.com/a/42037557/9538