【问题标题】:Is there a PHP library for email address validation? [closed]是否有用于电子邮件地址验证的 PHP 库? [关闭]
【发布时间】:2010-09-14 18:00:52
【问题描述】:

我需要验证我的用户的电子邮件地址。不幸的是,制作一个conforms to standards 的验证器很难。

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

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

【问题讨论】:

  • 我们说的是电子邮件还是电子邮件地址?
  • 我的意思是电子邮件地址。我已经更正了我的问题以反映这一点。谢谢

标签: php email open-source email-validation


【解决方案1】:

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

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

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

【讨论】:

  • 我正在编写一个需要基本验证器的简单(非企业)应用程序。虽然 FILTER_VALIDATE_EMAIL 似乎没有完全实现规范——例如,它未能通过code.iamcal.com/php/rfc822/rfc822.phps 的一些测试——但它似乎“足够好”满足我当前的需求。谢谢!
【解决方案2】:

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 可能无效。

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

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

【讨论】:

  • 这是一个有效的答案,我通常会这样做。但是对于这个特定的客户,我需要一种方法来检查电子邮件是否有效。电子邮件验证的替代方法是要求用户输入他们的电子邮件两次,我强烈反对。希望我能说服他们不要这样做。
  • 复式输入有什么问题?这是一种快速、廉价且简单的方法,可确保用户在输入电子邮件地址时不会乱动。如果您真的需要验证电子邮件地址的格式是否有效, Dominic 的回答(和链接的网站)似乎包含了我所见过的最全面的信息。
  • @afrazier:“复式输入有什么问题?”好吧,如果人们喜欢我,他们只需将第一个条目复制/粘贴到第二个条目中,所以好处是空的......
【解决方案3】:

[更新] 我在这里整理了我所知道的有关电子邮件地址验证的所有信息:http://isemail.info,它现在不仅可以验证,还可以诊断电子邮件地址的问题。我同意这里的许多 cmets,即验证只是答案的一部分;在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。

【讨论】:

  • 感谢您这样做;有真实的数据可以处理,而不仅仅是猜测,这真是太棒了。您是否还可以包含此页面上提到的其他库?
【解决方案4】:

Cal Henderson(来自 Flickr)写了一封 RFC822 compliant email address matcher,其中解释了 RFC 和使用 RFC 匹配电子邮件地址的代码。我已经使用了很长一段时间了,没有任何抱怨。

RFC822(1982 年发布)定义, 除其他外,格式为 互联网短信(电子邮件) 地址。您可以通过以下方式找到 RFC 谷歌搜索 - 有很多很多副本 他们在线。他们有点简洁 和奇怪的格式,但有一个 一点点努力,我们就可以看到它们是什么 到达。

...更新...

正如 Porges 在 cmets 中指出的那样,链接上的库已过时,但该页面有一个指向 updated version 的链接。

【讨论】:

  • 值得注意的是,RFC822 是古老的,正如引用所指出的那样。事实上,过时 822 (2822) 的 RFC 过时了,这表明它已经过时了 :) 电子邮件地址的当前 RFC 是 5322,发布了这个答案的月份!
【解决方案5】:

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

还有其他的吗?

【讨论】:

  • 我在几个项目中使用了它的前身,到目前为止还没有任何问题。我说去吧。
  • 链接仍然有效,但也许是an update 的时间了?它可能会也可能不会移动到其他地方,比如 GitHub。但是没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    我建议查看 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 em> 调用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2015-08-01
      • 2012-10-30
      • 2021-07-03
      • 2015-10-21
      • 2011-08-22
      • 2014-06-05
      相关资源
      最近更新 更多