如果有一个可以处理这个问题的正确的正则表达式模式,那么从一个来自电子邮件表单“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的解决方案开放。
由于
答案 0 :(得分:6)
尝试
\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,了解正则表达式在字符串中查找电子邮件地址的缺点。
答案 1 :(得分: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];
现在,$ email会有一个包含所有电子邮件地址的数组。
答案 2 :(得分:1)
虽然你的问题是针对RegEx的,而蒂姆给了你一个很好的答案,对于寻找简单解决方案的人,请查看第http://php.net/manual/en/function.mailparse-rfc822-parse-addresses.php页上的mailparse_rfc822_parse_addresses
请注意,这不是标准的PHP函数,需要安装扩展。经济托管解决方案可能不允许您安装PECL扩展。