正则表达式并不真正适合确定电子邮件地址语法的有效性,filter_var 函数的FILTER_VALIDATE_EMAIL 选项也相当不可靠。我使用EmailAddressValidator Class 来测试电子邮件地址的语法。
我整理了几个filter_var(PHP 版本 5.3.2-1ubuntu4.2)返回的错误结果的示例。可能还有更多。有些确实有点极端,但仍然值得注意:
RFC 1035 2.3.1。首选名称语法
http://tools.ietf.org/search/rfc1035
概括为:域由点分隔符分隔的标签组成(但对于本地域不一定如此)。
echo filter_var('name@example', FILTER_VALIDATE_EMAIL);
// name@example
RFC 1035 2.3.1。首选名称语法
标签必须遵循 ARPANET 主机名的规则。它们必须以字母开头,并以字母或数字开头,内部字符只能是字母、数字和连字符。
echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
// name@1example
RFC 2822 3.2.5。带引号的字符串
https://www.rfc-editor.org/rfc/rfc2822#section-3.2.5
这是有效的(尽管它被许多邮件服务器拒绝):
echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL);
// FALSE
RFC 5321 4.5.3.1.1。本地部分
https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.1
用户名或其他本地部分的最大总长度为 64 个八位字节。
测试 70 个字符:
echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
// AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
RFC 5321 4.5.3.1.2。域名
https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.2
域名或号码的最大总长度为 255 个八位字节。
测试 260 个字符:
echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
// name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
查看Validate an E-Mail Address with PHP, the Right Way 了解更多信息。