是否有用于电子邮件地址验证的 PHP 库


Is there a PHP library for email address validation?

我需要验证用户的电子邮件地址。不幸的是,制作符合标准的验证器是很困难的。

下面是一个尝试符合标准的正则表达式示例。

是否有验证电子邮件地址的PHP库(最好是开源库)?

你看过PHP的filter_函数吗?他们并不完美,但根据我的经验,他们做得相当不错。

示例用法(返回布尔值):

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

AFAIK,验证电子邮件的唯一好方法是发送电子邮件,并查看用户是否使用此电子邮件中的链接返回站点。这就是很多网站所做的。

正如您在链接到众所周知的庞大正则表达式时指出的那样,验证所有形式的电子邮件地址都很难,几乎是不可能的。即使是微不足道的电子邮件,也很容易出错(我发现太多网站拒绝电子邮件地址中的大写字母!大多数旧的正则表达式拒绝超过 4 个字母的 TLD!

AFAIK,"Jean-Luc B. O'Grady"@example.com 和 e=m.c^2@[82.128.45.117] 都是有效地址...虽然 I-Made-It-Up@Absurd-Domain-Name.info 很可能是无效的。

所以不知何故,我会检查我们是否有一些东西,一个唯一的@,其他的东西,然后随之而去:它会捕获大多数用户错误(如空字段或用户名而不是电子邮件地址)。
如果用户想提供一个假地址,它只会给出一些看起来正确的随机(see@on.tv 或 bill.gates@microsoft.com)。没有验证者会捕获拼写错误(jhon.b@example.com 而不是 john.b@example.com)。

如果真的想根据完整的 RFC 验证电子邮件,我建议使用正则表达式围绕 @ 进行拆分,然后分别检查本地名称和域名。以 " 开头的本地名称与其他大小写等分开。以 [ 开头的域名与其他情况等分开。 在较小的特定域中拆分问题,并且仅在定义良好、更简单的情况下使用正则表达式。
当然,这个建议可以应用于很多正则表达式的使用......

[更新] 我在这里整理了我所知道的有关电子邮件地址验证的所有信息:http://isemail.info,现在不仅可以验证,还可以诊断电子邮件地址的问题。我同意这里的许多评论,即验证只是答案的一部分;请参阅我在 http://isemail.info/about 的文章。

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

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

我将尝试使此页面保持最新状态,因为人们增强了他们的验证器。感谢Cal,Dave和Phil在编译这些测试时的帮助和合作以及对我自己的验证者的建设性批评。

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

Cal Henderson(Flickr的)编写了一个符合RFC822的电子邮件地址匹配器,并解释了RFC和利用RFC匹配电子邮件地址的代码。 我已经使用它一段时间了,没有任何抱怨。

RFC822(1982年发布)定义了, 除其他事项外,格式 互联网短信(电子邮件) 地址。您可以通过以下方式找到 RFC 谷歌搜索 - 有很多很多副本 他们在线。他们有点简洁 并且格式奇怪,但带有 不费吹灰之力就能看到它们是什么 得到。

。更新。。。

正如 Porges 在评论中指出的那样,链接上的库已经过时,但该页面有一个指向更新版本的链接。

我在谷歌代码中找到了一个库:http://code.google.com/p/php-email-address-validation/

还有其他人吗?

Zend_Validate包含一个电子邮件验证器。

周围有很多正则表达式用于验证 - 从非常基本到非常高级的所有内容。您确实应该选择与应用程序中有效电子邮件的重要性相匹配的内容。

我建议查看Zend_Validate_EmailAddress [source]的源代码。

修复依赖项后,只需执行以下操作:

$mail_validator = new Zend_Validate_EmailAddress();
$mail_validator->isValid($address);   // returns true or false

最好的方法是通过svn external将完整的 Zend 库放入您的项目中,并指向它的包含路径......

但是您可以下载必要的文件(1,2,3,4,5,6),并将它们全部包含(删除require_once调用)。