我需要验证我的用户的电子邮件地址。不幸的是,制作一个符合标准的验证器是很困难的。
下面是一个regex表达式的示例,该表达式试图符合标准
是否有任何验证电子邮件地址的PHP库(最好是开源的)?
我们说的是电子邮件还是电子邮件地址?
我指的是电子邮件地址。我已经纠正了我的问题以反映这一点。谢谢
你看过PHP的过滤函数吗?他们不完美,但以我的经验,他们做得相当不错。
示例用法(返回布尔值):
filter_var($someEmail, FILTER_VALIDATE_EMAIL);
我正在编写一个需要基本验证程序的简单(非企业)应用程序。虽然filter_validate_email似乎没有完全实现规范——例如,它在code.iamcal.com/php/rfc822/rfc822.phps上的一些测试失败了——但对于我当前的需求来说,它似乎"足够好"。谢谢!
afaik,验证电子邮件的唯一好方法是发送电子邮件,并查看用户是否使用此电子邮件中的链接返回该站点。很多网站都是这样做的。
正如你所指出的,通过链接到著名的猛犸象regex,验证所有形式的电子邮件地址都是困难的,几乎是不可能的。即使是对于琐碎的风格的电子邮件,也很容易出错(我发现太多的网站拒绝使用电子邮件地址中的上限!大多数旧的正则表达式拒绝超过4个字母的TLD!).
afaik,"jean-luc b.o'grady"@example.c o m和e=m.c^2@[82.128.45.117]都是有效地址…而i-made-it-up@荒谬-domain-name.info可能无效。
所以,不知何故,我会检查一下我们是否有一些东西,一个唯一的@和其他东西,然后继续:它会捕获大多数用户错误(如空字段或用户名而不是电子邮件地址)。如果用户想给出一个假地址,它只会随机给出看起来正确的地址(请参见@on.tv或bill.gates@microsoft.com)。并且没有验证器会发现输入错误(jhon.b@example.com而不是john.b@example.com)。
如果有人真的想根据完整的RFC验证电子邮件,我建议使用regex来拆分@,然后分别检查本地名称和域名。以"与其他情况等开头的本地名称的独立事例。以[与其他情况等开头的域名的独立事例。在较小的特定域中拆分问题,并且仅在定义良好、更简单的情况下使用regex。当然,这个建议可以应用到很多regex的使用中…
这是一个有效的答案,我通常会这么做。但是对于这个特定的客户,我需要一种方法来检查电子邮件是否有效。电子邮件验证的另一个选择是要求用户输入他们的电子邮件两次,我强烈反对。希望我能说服他们不要这样做。
复式入境怎么了?这是一种快速、廉价且简单的方法,可以确保用户在输入电子邮件地址时不会把它弄脏。如果您真的需要验证电子邮件地址的格式是否有效,Dominic的答案(和链接的站点)似乎包含了我见过的最全面的信息。
@阿芙拉齐尔:"复式飞机怎么了?"好吧,如果人们喜欢我,他们只需将第一个条目复制/粘贴到第二个条目中,这样做的好处是无效的…
[更新]我在这里整理了我所知道的关于电子邮件地址验证的所有信息: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在编译这些测试时的帮助和合作以及对我自己的验证器的建设性批评。
人们应该特别注意RFC3696的勘误表。其中三个规范示例实际上是无效地址。地址的最大长度是254或256个字符,而不是320个字符。
感谢您这么做;拥有真正的数据而不仅仅是猜测,这真是太棒了。您还可以包括本页提到的其他库吗?
Cal Henderson(Flickr的)写了一个符合RFC822的电子邮件地址匹配器,解释了RFC和使用RFC匹配电子邮件地址的代码。我已经用了一段时间了,没有抱怨。
RFC822 (published in 1982) defines,
amongst other things, the format for
internet text message (email)
addresses. You can find the RFC's by
googling - there's many many copies of
them online. They're a little terse
and weirdly formatted, but with a
little effort we can seewhat they're
getting at.
…更新。。。
正如Porges在评论中指出的那样,链接上的库已经过时了,但是该页面有一个指向更新版本的链接。
很好,谢谢你的链接。
值得注意的是,正如引文所指出的,RFC822是古老的。事实上,废弃822(2822)的RFC也是过时的,这说明它已经过时了:)电子邮件地址的当前RFC是5322,发布在这个答案的月份!
我在google代码中找到了一个库:http://code.google.com/p/php-email-address-validation/
还有其他的吗?
我在多个项目中使用了它的前身,到目前为止还没有任何问题。我说去吧。
Zend_验证包括电子邮件验证程序。
周围有很多用于验证的正则表达式——从非常基本到非常高级。您真的应该选择与应用程序中有效电子邮件的重要性相匹配的邮件。
我建议查看zend_validate_emailaddress[来源]的源代码。
一旦您的依赖关系得到修复,您可以简单地执行以下操作:
$mail_validator = new Zend_Validate_EmailAddress();
$mail_validator->isValid($address); // returns true or false
最好是通过SVN外部将完整的Zend库导入到您的项目中,并将include路径指向它…
但您只需下载必要的文件(1、2、3、4、5、6),并将它们全部包含在内(删除"一次性调用"的要求)。