如何在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; }
远离regex
和filter_var()
解决scheme来validation电子邮件。 看到这个答案: https : //stackoverflow.com/a/42037557/953833
- HTML5:只有整数的数字inputtypes?
- validationJavaScript中的十进制数 – IsNumeric()
- 一个全面的电话号码validation正则expression式
- 我如何在rails中validationdate?
- validationdynamic添加的字段
- 正则expression式匹配来testing一个有效的年份
- MVCvalidationunit testing
- jQueryvalidation器和使用AJAX的自定义规则
- ASP.NET MVC 5 Web.config:“FormsAuthenticationModule”或“FormsAuthentication”