为什么我的 PHP 电子邮件正则表达式不起作用?

Why doesn't my email regex for PHP work?

提问人:Andrew G. Johnson 提问时间:1/22/2009 更新时间:3/24/2010 访问量:584

问:

我在 Javascript 中有相同的表达式,但它在 PHP 中不适用于服务器端验证。代码如下

if (ereg('/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+([a-zA-Z])+/',$_POST['email-address']))
    echo "valid email";
else
    echo "invalid email";
PHP 正则表达式

评论

0赞 Powerlord 1/22/2009
您的正则表达式似乎是 preg_match 格式,而不是 ereg 格式......最明显的是前导和尾随/字符。
1赞 tddmonkey 1/22/2009
您的正则表达式是否处理名称部分中的“+”?乍一看,它似乎没有。这里有一篇关于将电子邮件作为正则表达式处理的好文章 regular-expressions.info/email.html
0赞 PhiLho 1/22/2009
太好了,正则表达式中的另一个电子邮件“验证器”... :-(秋葵汤的建议很好!顺便说一句,([a-zA-Z])+([a-zA-Z])+ 看起来很奇怪。我想知道为什么你要做这么多的捕获而不使用它们。
0赞 PeeHaa 8/20/2012
如何在 PHP 中验证电子邮件地址的可能重复

答:

3赞 Sampson 1/22/2009 #1

我使用以下内容。在比较之前,我还会在输入字符串上运行 TRIM():

function is_email($string) {
  if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$string)) {
    return true;
  } else {
    return false;
  }
}
-1赞 Raúl Roa 1/22/2009 #2

这可能是因为您用于连接表达式 (+) 的符号。

无论如何,你应该试试这个:

\w+([-+.']\w+)@\w+([-.]\w+).\w+([-.]\w+)*

评论

0赞 Robert K 1/22/2009
这不是串联,而是意味着必须“一次或多次”包含字符集。
9赞 DMeier 1/22/2009 #3

PHP 自带的过滤器:

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {

echo "E-mail is not valid";

} else {

echo "E-mail is valid";

}

评论

0赞 Erik 1/25/2010
我可以为您提供FILTER_VALIDATE_EMAIL说无效的有效电子邮件地址列表。
7赞 Gumbo 1/22/2009 #4

不要使用正则表达式来“验证”电子邮件地址

编辑:链接已断开。这可能是正确的链接

评论

0赞 sleske 3/24/2010
希望我能不止一次地投赞成票。这真的是一个 TFAQ(太常被问到的问题)......
4赞 ʞɔıu 1/22/2009 #5

使用 preg_match,而不是 EREG。EREG 正则表达式字符串不使用括号斜杠字符。

此外,在 PHP 中的单引号字符串中可能不需要双反斜杠(尽管不确定)

2赞 Dominic Sayers 2/11/2009 #6

我现在已经整理了来自 Cal Henderson、Dave Child、Phil Haack、Doug Lovell 和 RFC 3696 的测试用例。共158个测试地址。

我针对我能找到的所有验证器运行了所有这些测试。比较如下:http://www.dominicsayers.com/isemail

我会尽量让这个页面保持最新,因为人们增强了他们的验证者。感谢 Cal、Dave 和 Phil 在编译这些测试时的帮助和合作,以及对我自己的验证者的建设性批评。

人们应该特别注意针对 RFC 3696 的勘误表。其中三个规范示例实际上是无效的地址。地址的最大长度为 254 或 256 个字符,而不是 320 个字符。