如何在PHP中validation电子邮件?

我怎样才能validationinput值是一个有效的电子邮件地址使用php5。 现在我正在使用这个代码

function isValidEmail($email){ $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$"; if (eregi($pattern, $email)){ return true; } else { return false; } } 

但它显示不赞成的错误。 我该如何解决这个问题。 请帮帮我。

你可以使用filter_var()函数,它提供了很多方便的validation和消毒选项。

 filter_var($email, FILTER_VALIDATE_EMAIL) 
  • PHP手册filter_var()

  • 可用PHP> = 5.2.0

如果你不想改变依赖于你的函数的代码,只需要:

 function isValidEmail($email){ return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } 

注意 :对于其他用途(您需要Regex),弃用的ereg函数族(POSIX Regex函数)应该被preg族( PCRE Regex函数 )replace。 有一些差异,阅读手册应该足够了。

更新1 :正如@binaryLV指出的那样 :

PHP 5.3.3和5.2.14有一个与FILTER_VALIDATE_EMAIL相关的错误 ,在validation大值时导致段错误 。 简单和安全的解决方法是在filter_var()之前使用strlen() filter_var() 。 我不确定5.3.4的最终版本,但是写​​了一些5.3.4快照的版本也受到了影响。

这个bug已经被修复了。

更新2 :这种方法当然会validationbazmega@kapa作为一个有效的电子邮件地址,因为实际上它是一个有效的电子邮件地址。 但大部分时间在互联网上,你也想要电子邮件地址有一个TLD: bazmega@kapa.com 。 正如本博文 ( @Istiaque Ahmed发布的链接)中所build议的那样,您可以使用正则expression式来扩充filter_var() ,该正则expression式将检查域部分中是否存在点(不会检查有效的 TLD):

 function isValidEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/@.+\./', $email); } 

正如@Eliseo Ocampos所指出的那样,这个问题只存在于PHP 5.3之前, 在那个版本中他们改变了正则expression式 ,现在它做了这个检查,所以你不必这样做。

请参阅http://www.php.net/manual/en/function.ereg.php上的说明:;

 Note: 

从PHP 5.3.0起,正则expression式扩展被弃用,以支持PCRE扩展 。 调用此函数将发出E_DEPRECATED通知。 有关转换为PCRE的帮助,请参阅差异列表 。

 Note: 

使用Perl兼容的正则expression式语法的preg_match()通常是ereg()的更快select。

这是旧post,但我会分享一个我的解决scheme,因为没有人在这里提到一个问题。

新的电子邮件地址可以包含UTF-8字符或特殊的域名,如.live.news

此外,我发现一些电子邮件地址可以在Cyrilic和所有情况下标准正则expression式或filter_var()将失败。

这就是为什么我为它做了一个解决scheme:

 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,}(?:(?:[az][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; } } } 

此function适用于所有情况和电子邮件格式。

我总是用这个:

 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; } 

远离regexfilter_var()解决scheme来validation电子邮件。 看到这个答案: https : //stackoverflow.com/a/42037557/953833