多种可能性的正则表达式

时间:2013-03-04 21:45:22

标签: php regex

我有一段代码对于用实际链接替换电子邮件地址非常有用。有时电子邮件地址有多个后缀(即:.co.uk vs .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+%

3 个答案:

答案 0 :(得分: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

..因为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);

进一步说明:) :)有效的电子邮件地址也可以是:

test@192.168.0.1

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

我建议你从网上记录一篇经过详细阐述的文章。

答案 1 :(得分:0)

这可能适合您:%\w+\@(?:\w+\.)*\w+\.\w+%

它允许尽可能多的子域或TLD。这是an example的实际行动。

(?:\w+\.)*表示&#34;出现零个或多个子域后跟一个点&#34;。 (?:使其不匹配。

答案 2 :(得分:0)

使用交替;)

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