我收到的内容如下:
"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()
给我我想要的东西。我的正则表达式中缺少什么?
你的正则表达式太贪婪了。改用/<(.*?)>/
,甚至更好的是类似的东西
/<([^<>]+@[^<>]+)>/
我用它来匹配电子邮件,我知道还有其他表达式可能会捕获更多的电子邮件地址,但我发现这个可以快速输入并且到目前为止适合我的所有需求,请随时尝试:
/'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);
最简单的方法是匹配除最终分寸之外的所有内容:
/<([^>]*)>/
你用点包含了太多。试试这个:
/<([^>]*)>/