我需要验证用户的电子邮件地址.不幸的是,制作符合标准的验证器很难
以下是尝试符合标准的正则表达式的示例
是否有任何验证电子邮件地址的PHP库(最好是开源)?
你看过PHP的filter_函数了吗?他们并不完美,但根据我的经验他们做得相当不错.
用法示例(返回布尔值):
filter_var($someEmail, FILTER_VALIDATE_EMAIL);
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.信息可能无效.
所以不知何故,我只会检查我们有什么东西,一个独特的@,别的东西,并继续它:它会捕获大多数用户错误(如空字段或用户名而不是电子邮件地址).
如果用户想要提供虚假地址,那么它只会给出随机看起来正确的内容(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在评论中指出的那样,链接上的库已经过时,但该页面有一个指向更新版本的链接.
我在Google代码中找到了一个库:http://code.google.com/p/php-email-address-validation/
还有其他人吗?