【问题标题】:Regex to parse Email Form "To" field正则表达式解析电子邮件表单“收件人”字段
【发布时间】:2011-04-22 14:25:19
【问题描述】:

如果有一个可以处理这个问题,那么从来自电子邮件表单“To”行的字符串中提取电子邮件地址的正确正则表达式模式是什么,它允许地址用逗号“,”,分号分隔“;”、空格或三者的任意组合。正则表达式还必须能够忽略“噪音”文本,例如地址是否包含在“”字符中,或者在电子邮件地址旁边有一个实际名称。例如,来自 To 字段中的这个字符串:

"Joe Smith" <jsmith@example.com>, kjones@aol.com; someoneelse@nowhere.com mjane@gmail.com

该模式应该能够返回以下匹配项: jsmith@example、kjones@aol.com、someoneelse@nowhere.com、mjane@gmail.com

我正在使用 PHP,所以如果这不能在单个正则表达式中完成,那么我肯定对其他基于 PHP 的解决方案持开放态度。

谢谢

【问题讨论】:

  • 使用电子邮件解析库。无需自己执行此操作。 (您不是第一个需要解析电子邮件标头的 PHP 程序员。)

标签: php regex email-validation


【解决方案1】:

试试

\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b

(由RegexBuddy提供)如

preg_match_all('/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];

注意/i 修饰符使其不区分大小写。

另请参阅this question,了解正则表达式在字符串中查找电子邮件地址的缺点。

【讨论】:

  • 感谢您允许在我的电子邮件地址中使用+...最近我遇到了一些不允许的注册表单...真的很烦我。
【解决方案2】:

我从http://www.webcheatsheet.com/php/regular_expressions.php 得到了正则表达式,只是稍微修改了一下。

$string = '"Joe Smith" <jsmith@example.com>, kjones@aol.com; someoneelse@nowhere.com mjane@gmail.com';
$email_regex = "/[^0-9< ][A-z0-9_]+([.][A-z0-9_]+)*@[A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}/";
preg_match_all($email_regex, $string, $matches);
$emails = $matches[0];

现在 $emails 将有一个包含您所有电子邮件地址的数组。

【讨论】:

    【解决方案3】:

    虽然您的问题是针对 RegEx 的,并且 Tim 给了您一个很好的答案,但对于寻找简单解决方案的人,请查看 http://php.net/manual/en/function.mailparse-rfc822-parse-addresses.php 页上的 mailparse_rfc822_parse_addresses

    请注意,这不是标准的 PHP 函数,需要安装扩展。经济型托管解决方案可能不允许您安装 PECL 扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2012-01-02
      相关资源
      最近更新 更多