正则表达式获取从电子邮件地址

问题描述:

电子邮件来处理我的电子邮件地址,可能或者是 $email = "[email protected]";$email="Johnny <[email protected]>" 我想 $handle = "x";的任一版本的$电子邮件。 这怎么可以在PHP中完成(假设正则表达式)。我不擅长正则表达式。正则表达式获取从电子邮件地址

在此先感谢

+1

注意(假设你用从“从:”未来的工作电子邮件地址一个完整的PHP解决方案线的RFC2822电子邮件消息或等效消息),在显示名称中引用@或s的尖括号是完全可能的。例如:``“Johnny @ home”` – 2011-01-07 01:42:30

+2

David的权利。下面的答案都不会覆盖整个有效的电子邮件地址范围。这是一个相当困难的问题,如果做得对,可能需要一个解析器,而不是正则表达式。但marcog的解决方案将会吸引97%的案例(给与或接受),这可能足以满足您的需求。 – dkarp 2011-01-07 03:39:25

使用正则表达式<?([^<]+?)@然后从$matches[1]得到的结果。

下面是它做什么:

  • <?相匹配的可选<
  • [^<]+?做了一个或多个不是^<的字符的非贪婪匹配。
  • @与电子邮件地址中的@相匹配。

一个非贪婪的匹配使匹配得到的匹配结果最短。这可以防止跑过@

Rubular:http://www.rubular.com/r/bntNa8YVZt

使用这个基本的电子邮件调查正则表达式只是搜索的字符串:\ B [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] +。 [AZ] {2,4} \ b 它会匹配任何文本中的任何电子邮件,并且在您的第一个字符串中匹配整个字符串,而在第二个字符串中,只匹配电子邮件字符串的一部分。

要快速学习正则表达式,这是最好的地方:http://www.regular-expressions.info

$email = '[email protected]'; 
preg_match('/([a-zA-Z0-9\-\._\+][email protected][a-z0-9A-Z\-\._]+\.[a-zA-Z]+)/', $email, $regex); 
$handle = array_shift(explode('@', $regex[1])); 

试一下(未测试)

这是基于marcog的回答

function extract_email($email_string) { 
    preg_match("/<?([^<]+?)@([^>]+?)>?$/", $email_string, $matches); 
    return $matches[1] . "@" . $matches[2]; 
} 

echo extract_email("[email protected]"); // outputs [email protected] 
echo extract_email("Ice Cream Bob <[email protected]>"); // outputs [email protected]