提问人:Andrew G. Johnson 提问时间:1/22/2009 更新时间:3/24/2010 访问量:584
为什么我的 PHP 电子邮件正则表达式不起作用?
Why doesn't my email regex for PHP work?
问:
我在 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";
答:
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 个字符。
评论