解析带有名称的电子邮件地址(FROM或TO)——不一定符合rfc 2822


Parsing an email address (FROM or TO) with name - not necessarily rfc 2822 compliant

我有一个电子邮件字段,可以用几种不同的方式格式化。

  1. hello@world.com

  2. "hello world" <hello@world.com>

  3. hello world <hello@world.com>

我想捕获hello world字符串(如果它在那里)电子邮件地址(如果它在那里)。我有一个几乎可以工作的正则表达式,但它不完全。

sed -r  's/"?([^"]+)*"?'s<?([^>]+@[^>]+)>?/["'1","'2"]/' <<< 'Hello World <helloworld@gmail.com>'

请帮忙吗?

更新:

这应该是你想要的:

^(?:"?([^@"]+)"?'s)?<?([^>]+@[^>]+)>?$

这将把第一部分(如果有的话)存储到第一个捕获组中,并将电子邮件地址存储到第二个捕获组中。

这个正则表达式看起来不太对。无论如何,在执行此regex期间会发生"Backtrack limit was用尽"错误(您可以使用preg_last_error函数检查它),因此您可以增加Backtrack limit以使其工作:

 ini_set('pcre.backtrack_limit', 1000000);
 var_dump(preg_replace('~"?([^"]+)*"?'s<?([^>]+@[^>]+)>?~', '["$1","$2"]', 'hello@world.com'));

输出:

 string(15) "hello@world.com"

Ruby(1.9+)

$ ruby -e 'p gets.scan(/"?([^"]+)*"?'s<?([^>]+@[^>]+)>?/)' <<< '"Hello World" <helloworld@gmail.com>'
[["Hello World", "helloworld@gmail.com"]]