PHP搜索字符串的电子邮件地址

问题描述:

嗨我试图搜索一个字符串,看看它是否包含一个电子邮件地址 - 然后返回它。PHP搜索字符串的电子邮件地址

的典型电子邮件vaildator表达式为:

eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email); 

但是我如何搜索,如果这是一个字符串,例如返回字符串中的电子邮件地址:

“嗨,我的名字是乔,我可以通过[email protected]联系我,我也在Twitter上。“

我有点难倒了,我知道,如果B为中心,但我怎么回什么是发现它的存在与\在所有我可以搜索。

谢谢。

+1

顺便说一下,该表达式不正确。 – 2010-01-12 17:14:39

+1

首先打在“电子邮件地址正则表达式”:http://www.regular-expressions.info/email.html – 2010-01-12 17:26:29

+0

可能重复[在PHP中,我如何从一个文本块中提取多个电子邮件地址,并把他们到一个数组?](http://stackoverflow.com/questions/3901070/in-php-how-do-i-extract-multiple-e-mail-addresses-from-a-block-of-text-and -put) – 2014-08-04 12:00:30

加$暂存器作为最后一个参数:

eregi("...", $email, $regs); 
+0

非常好,谢谢! – joobaal 2010-01-12 17:21:31

+3

Joobool,如果你发现这个答案有帮助,接受它。 – Sampson 2010-01-12 17:26:17

+0

请注意,'eregi'现在已经很长一段时间了。乔纳森桑普森的答案更好! – 2014-03-10 10:38:09

您可以使用preg_match(),它会将其输出到数组中供使用。

$content = "Hi my name is Joe, I can be contacted at [email protected] I am also on Twitter."; 
preg_match("/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/i", $content, $matches); 

print $matches[0]; // [email protected] 
+1

请注意,在这种情况下,您需要从模式的开头和结尾中删除^和$ - ^表示匹配字符串的开头,$匹配字符串的结尾,所以它除非电子邮件是整个字符串,否则不会找到“匹配”。要搜索包含的电子邮件地址,您需要更改: “^ [_ a-z0-9 - ] +(\。[_ a-z0-9 - ] +)* @ [a-z0-9 - ] +( \。[a-z0-9 - ] +)*(\。[az] {2,3})$“to”[_a-z0-9 - ] +(\。[_ a-z0-9 - ] + )* @ [a-z0-9 - ] +(\。[a-z0-9 - ] +)*(\。[az] {2,3})“ – Nicole 2010-01-12 17:15:14

+0

我决定继续使用eregi,谢谢指针Renesis。 – joobaal 2010-01-12 17:22:12

+0

哦,谢谢您也帮助乔纳森! – joobaal 2010-01-12 17:22:46

更好PCRE用于提取ADDR_SPEC是:

/[a-z0-9\._%+!$&*=^|~#%'`?{}/\-][email protected]([a-z0-9\-]+\.){1,}([a-z]{2,6})/ 

但如果你真的想解压缩的RFC 2822,那么你需要类似于:

/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

C.