REGEX在复杂URL中查找具有子域的URL

时间:2011-08-26 06:28:52

标签: php regex

道歉,如果之前已经回答了这个问题,但就像所有事情一样,google会给出十亿分的结果,这些都会导致错误的答案。

我有一个URL /电子邮件解析器链接我网站上的网址和电子邮件地址(PHP)。一切都很好,直到我获得了一些复杂域名(.com.au等)的国际客户

这是我目前的功能......

    FUNCTION linkScan($string1) {

    $pattern1 = "/(?<![\/\d\w])(http:\/\/)?([\w\d\-]+)((\.([\w\d\-])+){2,})([\/\?\w\d\.\-_&=+%]*)?/i";
    $pattern2 = "/([\w\d\.\-\_]+)@([\w\d\.\_\-]+)/mi";

    $replace1 = "<a href=\"http://$2$3$6\" target=\"_blank\">$0</a>";
    $replace2 = "<a href=\"mailto:$0\">$0</a>";

    $string2 = PREG_REPLACE($pattern1,$replace1,$string1);
    $string3 = PREG_REPLACE($pattern2,$replace2,$string2);

    $string3 = convertSmartQuotes($string3);


     RETURN $string3;
}

在找到电子邮件地址someone@somewhere.com.au

之前一切正常

因为它首先查找URL,它找到somewhere.com.au部分并将其作为链接,然后当电子邮件扫描发生时,由于现在嵌入了HTML标记,它将被忽略。

如果强制在URL中使用子域名(无论是www还是其他),我想做什么,而不关心前面是否有http://。但是因为正则表达式似乎只关心是否存在3个部分(子域,域,.com),所以正则表达式错误地认为.com.au中的.com实际上是域部分。

应该找到......

subdomain.domain.com

subdomain.domain.com.au

它不应该找到......

domain.com

domain.com.au(目前正在寻找)

如果有人可以帮助我们使用正则表达式,那就太棒了。 感谢

2 个答案:

答案 0 :(得分:1)

如果所有顶级域名及其结构都需要列表。 Mozilla项目有这样一个列表;它是几百行,所以把它加入正则表达式可能很麻烦,虽然肯定不是不可能的。 https://wiki.mozilla.org/TLD_List 更新取代http://publicsuffix.org/

无论如何,很可能你做错了。你想要完成什么?

答案 1 :(得分:-2)

Regex有一个很好的表达式列表,还包括一个很好的测试人员,以确保你的表达式有效。