答案 0 :(得分:16)
你看过PHP's filter_ functions了吗?他们并不完美,但根据我的经验他们做得相当不错。
示例用法(返回布尔值):
filter_var($someEmail, FILTER_VALIDATE_EMAIL);
答案 1 :(得分: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.info可能无效。
所以不知何故,我只会检查我们有什么东西,一个独特的@,别的东西,然后继续它:它会捕获大多数用户错误(如空字段或用户名而不是电子邮件地址)。 /> 如果用户想要提供虚假地址,那么它只会给出随机看起来正确的内容(see@on.tv或bill.gates@microsoft.com)。并且没有验证器会捕获拼写错误(jhon.b@example.com而不是john.b@example.com)。
如果真的想要针对完整的RFC验证电子邮件,我建议使用正则表达式来拆分@,然后单独检查本地名称和域名。以“从其他情况开始的本地名称的单独案例等。以[从其他情况开始的域名的单独案例等等。在较小的特定域中拆分问题,并且仅在明确定义的更简单的情况下使用正则表达式。
这个建议可以应用于很多正则表达式用途,当然......
答案 2 :(得分: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在编写这些测试和my own validator的建设性批评方面提供的帮助和合作。
人们应该特别注意errata against RFC 3696。其中三个规范示例实际上是无效地址。并且地址的最大长度为254或256个字符,不 320。
答案 3 :(得分:8)
Cal Henderson(Flickr)写了一篇RFC822 compliant email address matcher,其中解释了RFC和使用RFC匹配电子邮件地址的代码。我已经使用它已经有一段时间了,没有任何抱怨。
RFC822(1982年出版)定义, 除其他外,格式 互联网短信(电子邮件) 地址。你可以找到RFC的 谷歌搜索 - 有很多副本 他们在线。他们有点简洁 并且奇怪地格式化,但有一个 我们可以看到他们的努力 来了。
...更新......
在评论中指出Porges,链接上的图书馆已过时,但该页面上有updated version的链接。
答案 4 :(得分:5)
我在Google代码中找到了一个库:http://code.google.com/p/php-email-address-validation/
还有其他人吗?
答案 5 :(得分:1)
Zend_Validate包含电子邮件验证程序。
有许多正则表达式可用于验证 - 从非常基本到非常高级的所有内容。 你真的应该选择与你的应用程序中有效电子邮件的重要性相匹配的东西。
答案 6 :(得分:0)