【问题标题】:Why doesn't my email regex for PHP work?为什么我的 PHP 电子邮件正则表达式不起作用?
【发布时间】:2009-01-21 16:02:25
【问题描述】:

我在 Javascript 中有相同的表达式,但它在 PHP 中无法用于服务器端验证。这是代码

if (ereg('/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+([a-zA-Z])+/',$_POST['email-address']))
    echo "valid email";
else
    echo "invalid email";

【问题讨论】:

  • 您的正则表达式似乎是 preg_match 格式而不是 ereg 格式...最明显的是前导和尾随 / 字符。
  • 您的正则表达式是否处理名称部分中的“+”?乍一看,它似乎没有。这里有一篇关于将电子邮件作为正则表达式处理的好文章regular-expressions.info/email.html
  • 太好了,正则表达式中的另一个电子邮件“验证器”... :-( Gumbo 的建议很好!顺便说一句,([a-zA-Z])+([a-zA-Z ])+ 看起来很奇怪。我想知道您为什么要进行如此多的捕获而不使用它们。

标签: php regex


【解决方案1】:

PHP自带的过滤器:

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {

echo "E-mail is not valid";

} else {

echo "E-mail is valid";

}

【讨论】:

  • 我可以为您提供 FILTER_VALIDATE_EMAIL 认为无效的有效电子邮件地址列表。
【解决方案2】:

【讨论】:

  • 希望我能多次投票。这真的是一个 TFAQ(太常见的问题)......
【解决方案3】:

使用 preg_match,而不是 ereg。 ereg 正则表达式字符串不使用封闭的斜杠字符。

此外,在 PHP 中的单引号字符串中可能不需要双反斜杠(但不确定)

【讨论】:

    【解决方案4】:

    我使用以下内容。在比较之前,我还会在输入字符串上运行 TRIM():

    function is_email($string) {
      if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$string)) {
        return true;
      } else {
        return false;
      }
    }
    

    【讨论】:

      【解决方案5】:

      我现在整理了来自 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。

      【讨论】:

        【解决方案6】:

        这可能是因为您用于连接表达式 (+) 的符号。

        无论如何你都应该试试这个:

        \w+([-+.']\w+)@\w+([-.]\w+).\w+([-.]\w+)*

        【讨论】:

        • 这不是串联,它意味着一个字符集必须包含“一次或多次”。
        猜你喜欢
        • 2012-08-12
        • 1970-01-01
        • 2013-08-11
        • 2012-11-17
        • 2013-01-16
        • 1970-01-01
        • 2013-06-24
        • 2020-03-31
        相关资源
        最近更新 更多