发布日期:2018-03-26
如何在PHP中验证一个邮箱?+ 查看更多
如何在PHP中验证一个邮箱?
+ 查看更多
发布日期:2018-03-26 13:47
分类:PHP
浏览次数:58
我如何用php5去验证输入的内容是合法的邮箱地址。我现在是使用这样的代码:
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; } }
但是它显示已弃用错误。我如何修复这种情况,请帮助我。
回答
你可以使用filter_var()这个函数,它提供了很多方便的验证和处理选项。
filter_var($email, FILTER_VALIDATE_EMAIL)
·PHP Manual filter_var()
·在PHP >= 5.2.0中可用
·在PHP >= 5.2.0中可用
如果你不想改变依赖你这个函数的代码,只要这样做:
function isValidEmail($email){ return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; }
注意:
当你需要有其他用处(需要使用正则)时,ereg这个已经被遗弃的函数族(POSIX正则函数)应该被preg函数族(PCRE正则函数)替代。这是小数目的一些不同之处,阅读手册即可。
更新1:
对于@binaryLV提出的观点:
PHP 5.3.3和5.2.14存在一个和FILTER_VALIDATE_EMAIL相关的漏洞,它会在验证一个很大的值时出现段错误。简单且安全的解决方法是在使用filter_var()之前用上strlen()函数。我不确定 5.3.4的最终版怎么样,但是一些 5.3.4的快速版也会受到影响。这个漏洞已经被修复了。
PHP 5.3.3和5.2.14存在一个和FILTER_VALIDATE_EMAIL相关的漏洞,它会在验证一个很大的值时出现段错误。简单且安全的解决方法是在使用filter_var()之前用上strlen()函数。我不确定 5.3.4的最终版怎么样,但是一些 5.3.4的快速版也会受到影响。这个漏洞已经被修复了。
更新2:
这个方法当然会把bazmega@kapa验证为合法的邮箱地址,因为事实上它就是合法的地址。但是在互联网中的大多数时候,你会希望邮箱地址具有一个TLD:bazmega@kapa.com。就像在这个博客中提交的建议一样,你可以给filter_var()增加一个正则,它会在域名部分检查是否存在点(虽然不会检查是否存在合法的TLD):
function isValidEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/@.+\./', $email); }
这个问题只在PHP5.3之前出现,在那个版本,他们改变了正则,现在它会做这个检查,所以你没必要这么做。