6

如果有一个可以处理这个问题,那么从来自电子邮件表单“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 的解决方案持开放态度。

谢谢

4

3 回答 3

7

尝试

\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修饰符使其不区分大小写。

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

于 2010-10-07T21:08:50.310 回答
1

我从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 将有一个包含您所有电子邮件地址的数组。

于 2010-10-07T21:16:31.400 回答
1

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

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

于 2015-07-17T16:47:02.383 回答