【发布时间】:2011-09-30 08:28:22
【问题描述】:
我想用 preg_match_all 解析一个电子邮件地址列表(如 TO 标头中的那个),以获取用户名(如果存在)和电子邮件。类似于 Pear 中的 mailparse_rfc822_parse_addresses 或 Mail_RFC822::parseAddressList() 的东西,但使用纯 PHP。
输入:
"DOE, John \(ACME\)" <john.doe@somewhere.com>, "DOE, Jane" <jane.doe@somewhere.com>
输出:
array(
array(
'name' => 'DOE, John (ACME)',
'email' => 'john.doe@somewhere.com'
),
array(
'name' => 'DOE, Jane',
'email' => 'jane.doe@somewhere.com'
)
)
不需要支持奇怪的E-mail格式(/[a-z0-9._%-]+@[a-z0-9.-]+.[az]{2,4}/i电子邮件部分可以)。
我不能使用explode,因为逗号可以出现在名称中。 str_getcsv 不起作用,因为我可以:
DOE, John \(ACME\) <john.doe@somewhere.com>
作为输入。
更新:
目前,我有这个:
public static function parseAddressList($addressList)
{
$pattern = '/^(?:"?([^<"]+)"?\s)?<?([^>]+@[^>]+)>?$/';
if (preg_match($pattern, $addressList, $matches)) {
return array(
array(
'name' => stripcslashes($matches[1]),
'email' => $matches[2]
)
);
} else {
$parts = str_getcsv($addressList);
$result = array();
foreach($parts as $part) {
if (preg_match($pattern, $part, $matches)) {
$result[] = array(
'name' => stripcslashes($matches[1]),
'email' => $matches[2]
);
}
}
return $result;
}
}
但它失败了:
"DOE, \"John\"" <john.doe@somewhere.com>
我需要测试反向引用 \" 但我不记得如何做到这一点。
【问题讨论】: