使用名称解析电子邮件地址(FROM或TO) - 不一定符合rfc 2822

时间:2011-04-17 20:29:55

标签: php ruby regex sed

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

  1. hello@world.com

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

  3. hello world <hello@world.com>

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

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

    请帮帮忙?

3 个答案:

答案 0 :(得分:3)

更新

这应该做你想要的:

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

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

答案 1 :(得分:2)

正则表达式看起来不太对劲。无论如何,在执行此正则表达式期间出现“Backtrack limit is exhausted”错误(您可以使用preg_last_error函数进行检查),这样您就可以增加回溯限制以使其正常工作:

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

输出:

 string(15) "hello@world.com"

答案 2 :(得分:1)

红宝石(1.9 +)

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