1

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

这是我当前的代码 -

$input = "here is a line of text, test@test.com, email@domain.com, email@domain.co.uk 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+%

4

3 回答 3

2

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


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

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

所以它匹配:

test@test.com

test@sub.test.com

test@subsub.sub.test.com

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

test@test

..因为缺少顶级域名。


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

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);

进一步说明 :) :) 有效的电子邮件地址也可以如下所示:

test@192.168.0.1

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

我建议您从网络上获取一份经过详细说明的文档。

于 2013-03-04T21:47:27.213 回答
0

这可能对您有用:%\w+\@(?:\w+\.)*\w+\.\w+%

它允许尽可能多的子域或 TLD。这是它的一个例子

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

于 2013-03-04T21:47:27.937 回答
0

使用交替;)

preg_match_all('%\w+\@\w+\.\w+\.\w+|\w+\@\w+\.\w+%', $input, $matches);
于 2013-03-04T21:47:36.853 回答