0

我正在接收以下内容:

"Jane Doe" <jane@doe.com>, "John Doe" <john@doe.com>

我想提取电子邮件地址:

jane@doe.com, john@doe.com

目前我有一个这样的正则表达式:

/<(.*)>/

它将所有内容都放在括号之间,但它也得到以下内容:

jane@doe.com>, "John Doe" <john@doe.com

当我在中间使用 @ 符号时,它也不能正常工作:

/<(.*)@(.*)>/

我可以explode()基于逗号,但我认为应该有一种方法preg_match()可以给我想要的东西。我的正则表达式中缺少什么?

4

4 回答 4

3

你的正则表达式太贪心了。改为使用/<(.*?)>/,甚至更好的是

/<([^<>]+@[^<>]+)>/
于 2012-04-17T19:45:21.970 回答
3

我用它来匹配电子邮件,我知道在野外还有其他表达式可能会捕获更多的电子邮件地址,但我发现这个输入很快,到目前为止满足我的所有需求,请随意尝试:

/\w+[\.\w]+@\w+[\.\w]+/

您可能希望将其与 preg_match_all 一起使用来捕获所有地址

例如:

$string = '"Jane Doe" <jane@doe.com>, "John Doe" <john@doe.com>';
preg_match_all('/\w+[\.\w]+@\w+[\.\w]+/', $string, $matches);
print_r($matches);
于 2012-04-17T19:47:12.407 回答
1

最简单的方法是匹配除最终分隔符之外的所有内容:

/<([^>]*)>/
于 2012-04-17T19:40:41.607 回答
0

您在点中包含太多内容。试试这个:

/<([^>]*)>/
于 2012-04-17T19:40:56.583 回答