我收到的内容如下:
"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()
应该有办法给我我想要的东西。我的正则表达式中缺少什么?
答案 0 :(得分:3)
你的正则表达式是greedy。改为使用/<(.*?)>/
,或者甚至更好地使用
/<([^<>]+@[^<>]+)>/
答案 1 :(得分: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);
答案 2 :(得分:1)
最简单的方法是匹配除最终除界之外的所有内容:
/<([^>]*)>/
答案 3 :(得分:0)
你在点上包含太多了。试试这个:
/<([^>]*)>/