2013-03-04 68 views
1

我有一段代码对于用实际链接替换电子邮件地址非常有用。有时电子邮件地址有多个后缀(即:.co.uk和.com)。我能够为这些场景中的每一个创建正则表达式,但是我很好奇,如果有任何正则表达式的大师知道将两者结合成单个表达式的方法。如果是这样,你能解释一下你的答案是什么以及它为什么起作用?对于多种可能性的正则表达式

这里是我当前的代码 -

$input = "here is a line of text, [email protected], [email protected], [email protected] here"; 

preg_match_all('%\w+\@\w+\.\w+\.\w+%', $input, $matches); 

$outmatch = Array(); 

if(is_array($matches[0])){ 
    foreach($matches[0] as $match){ 
     array_push($outmatch,$match); 
    } 
} 

$outmatch = array_unique($outmatch); 

if(is_array($outmatch)){ 
    foreach($outmatch as $outm){ 
     $input = str_replace($outm,'<a href="mailto:' . $outm . '">' . $outm . '</a>',$input); 
    } 
} 

print $input; 

表达2后缀:%\w+\@\w+\.\w+\.\w+%

表达式1个后缀:%\w+\@\w+\.\w+%

+0

你为什么讨厌我的'有人+东西@ example.com' EMAILADDRESS? – Wrikken 2013-03-04 21:50:49

+1

因为这不自然!好的一点,谢谢。 – user1145643 2013-03-04 21:59:22

回答

2

首先,我的目的并不是要制定配套的完美匹配的正则表达式电子邮件地址在这篇文章。我只是想帮助提问者一点点。 :)


以下正则表达式匹配至少一个域及其tld,但它允许多个子域。

preg_match_all('%\w+\@\w+\.\w+(\.\w+)?%', $input, $matches); 

所以它匹配:

[email protected] 

[email protected] 

[email protected] 

...等等。但它不匹配:

[email protected] 

..因为tld丢失。


进一步注意,一个有效的电子邮件用户名可以包含像点.字符所以\w不会匹配所有可能的地址。所以bettern模式可能是这样的:

preg_match_all('%[a-zA-Z0-9._\%+-]+\@\w+\.\w+(\.\w+)?%', $input, $matches); 

进一步注:)一个有效的域名也可以包含数字和例如-特殊字符。这导致这样的正则表达式:

preg_match_all('%[a-zA-Z0-9._\%\+\-]+\@[a-zA-Z0-9\-]+\.\w+(\.\w+)?%', $input, $matches); 

此外,注意:) :)一个有效的电子邮件地址,也可以是这样的:

[email protected] 

..没有域名。另请注意,任何没有tld的电子邮件地址都是有效的。你看到创建一个真正的匹配电子邮件正则表达式不那么容易。

我建议你从网站上获得一份详细记录,并在时间内详细阐述。

+1

优秀!那么我是否认为'()?'意味着括号中的任何内容可能会或可能不会出现未知数量的时间? – user1145643 2013-03-04 21:56:59

+0

是的,这是正确的。请参阅preg语法手册:http://php.net/manual/de/reference.pcre.pattern.syntax.php – hek2mgl 2013-03-04 21:57:54

+1

它不适用于您的第三个示例:http://bit.ly/Z3DMgg – 2013-03-04 22:03:37

0

这可能会为你工作:%\w+\@(?:\w+\.)*\w+\.\w+%

它可以让尽可能多的子域或顶级域名是必要的。这是它的行动an example

(?:\w+\.)*意思是“零个或多个出现子域后跟一个点”。(?:使它不匹配。

0

交替使用;)

preg_match_all('%\w+\@\w+\.\w+\.\w+|\w+\@\w+\.\w+%', $input, $matches); 
+0

很好。我会记住一个不同类型的问题。 – user1145643 2013-03-04 22:02:32