8

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

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

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

4

7 回答 7

16

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

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

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

于 2008-10-02T08:34:26.340 回答
12

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

正如您通过指向众所周知的庞大正则表达式的链接所指出的那样,验证所有形式的电子邮件地址非常困难,几乎是不可能的。很容易做错,即使是琐碎的电子邮件(我发现太多网站拒绝电子邮件地址中的大写字母!而且大多数旧的正则表达式拒绝超过 4 个字母的 TLD!)。

AFAIK、“Jean-Luc B. O'Grady”@example.com 和 e=mc^2@[82.128.45.117] 都是有效地址……而 I-Made-It-Up@Absurd-Domain-Name。信息可能无效。

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

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

于 2008-10-02T09:58:17.200 回答
10

[更新] 我在这里整理了我所知道的关于电子邮件地址验证的所有信息: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。

于 2009-02-10T16:11:47.320 回答
8

Cal Henderson(来自 Flickr)编写了一个符合 RFC822 的电子邮件地址匹配器,其中包含对 RFC 的解释以及利用 RFC 匹配电子邮件地址的代码。我已经使用它很长一段时间了,没有任何抱怨。

RFC822(1982 年发布)定义了互联网文本消息(电子邮件)地址的格式等。您可以通过谷歌搜索找到 RFC - 网上有很多副本。它们有点简洁且格式怪异,但只要稍加努力,我们就可以看到它们在做什么。

... 更新 ...

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

于 2008-10-03T16:26:32.347 回答
5

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

还有其他人吗?

于 2008-10-02T08:28:21.767 回答
1

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

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

于 2008-10-02T10:56:32.800 回答
0

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

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

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

最好的办法是将完整的 Zend 库通过svn external并指向它的包含路径...

但是您可以只下载必要的文件(123456),然后将它们全部包含在内(删除require_once调用)。

于 2008-10-02T12:00:39.917 回答