【问题标题】:Regex problem Email test正则表达式问题电子邮件测试
【发布时间】:2011-04-03 17:26:19
【问题描述】:

我对下面的模式有一些问题:

/([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}@(([A-Z0-9]+([-][A-Z0-9])*){2,}\.)+([A-Z0-9]+([-][A-Z0-9])*){2,}/i

它匹配电子邮件地址,我对此规则有疑问:

[A-Z0-9\.\_\+\-]*

如果我删除它可以工作的星,但我希望这个字符为 0 或更多。我在http://regexpal.com/ 上对其进行了测试,它可以工作,但在 preg_match_all (PHP) 上 - 没有工作

谢谢

【问题讨论】:

标签: php regex email


【解决方案1】:

为什么不使用 PHP filter_var()

filter_var('test@email.com', FILTER_VALIDATE_EMAIL)

没有好的正则表达式来验证电子邮件地址。如果您绝对必须使用正则表达式,那么不妨看看 Validate an E-Mail Address with PHP, the Right Way. 虽然,这也不是一个完美的衡量标准。

编辑:经过一番挖掘,我遇到了Mailparse

Mailparse 是解析的扩展 并处理电子邮件。它 可以处理 » RFC 822 和 » RFC 2045 (MIME) 兼容的消息。

Mailparse 是基于流的,这意味着 它不保留内存副本 它处理的文件 - 所以它是 交易时非常节省资源 包含大量消息。

【解决方案2】:

首先,有很多可用的资源。快速搜索“电子邮件验证正则表达式”会产生大量结果...包括This One...

其次,问题不在于* 字符。问题出在整个街区。

([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}

看看它在做什么。它基本上是说匹配尽可能多的字母数字,然后尽可能多地匹配其他字符的字母数字,然后重复至少 3 次,最多 64 次。这可能是很多字符...

相反,您可以这样做:

([A-Z0-9][A-Z0-9\.\_\+\-]{2,63})

这最多会匹配 64 个字符的电子邮件。

哦,还有this is the pain of parsing emails with regex

还有很多其他资源可用于验证电子邮件地址(包括 filter_var)。做一些搜索,看看流行的框架是如何做到的......

【讨论】:

    【解决方案3】:

    试试这个正则表达式:

    /^[A-Z0-9][A-Z0-9\.\_\+\-]{3,64}@([A-Z0-9][-A-Z0-9]*\.)+[A-Z0-9]{2,}$/i
    

    但就像@Russell Dias 所说,您不应该对电子邮件使用正则表达式。

    【讨论】:

    • 提取不是验证
    • 那么就可以给正则表达式加括号了,这里是3对。
    【解决方案4】:

    虽然我同意 Russel Dias 的观点,但我相信您的问题在于整个区块:

    ([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}

    基本上你是在说,你想要;

    • 字母或数字,1 次或多次
    • 字母或数字,0 次或多次
    • 重复上述操作 3 到 64 次

    【讨论】:

      【解决方案5】:

      你在整个组之后有数量修饰符:

      ([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}
      

      所以这将需要至少 3 个字母字符和类似这样的内容:

      a5________@gmail.com

      不会起作用,但是这个:

      a____a___a___@gmail.com

      将完成这项工作。最好找到一个经过良好测试的现成正则表达式。

      另外,你没有开始和结束分隔符,所以这样的事情会通过:

      &^$@#&$^@#&aaa5a55a55a@gmail.comADA;'DROP TABLE :)
      

      【讨论】:

      • 数量修饰符检查整个组,可以是 aaa,555,a12,fg8,f7ysf87s,8dfs9df.... 它适用于所有电子邮件,问题出在星号上。如果我删除它可以工作,但使用星号无法验证所有电子邮件
      • 我重新编辑了样本,忘记了 0-9,没有使用 _ 来表明我的意思
      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2011-12-28
      • 2012-01-02
      • 2015-12-03
      相关资源
      最近更新 更多