2011-08-26 107 views
0

如果在某个地方回答了此问题,但是像所有内容一样,Google会提供十亿个结果,导致错误答案。REGEX在复杂网址中查找包含子网域的网址

我有一个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; 
} 

,直到它找到一个电子邮件地址,它工作正常[email protected]

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

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

应该找...

subdomain.domain.com

subdomain.domain.com.au

它不应该找...

域.com

domain.com.au(目前发现)

如果有人能够用正则表达式来帮助我们,那太棒了。 谢谢

+0

不是一个真正的解决方案,而是让您的正则表达式更易于阅读:您可以使用除/以外的分隔符作为正则表达式,然后您不必在正则表达式中转义斜线。 –

+0

你的正则表达式很简单,它应该匹配'luser @ example.com.au'就好 - 你确定它没有? – tripleee

回答

1

如果所有顶级域名及其结构都需要列表。 Mozilla项目有这样一个列表;它有几百行,所以将它并入到正则表达式可能会很麻烦,尽管当然不是不可能的。 https://wiki.mozilla.org/TLD_List更新:被代替http://publicsuffix.org/

无论如何,很可能你在做错了。你想达到什么目的?

+0

基本上它是一个链接解析器。它需要查看文本(从数据库),找到任何匹配电子邮件地址或URL的文本,并将它们转换为链接。 –

-2

Regex有一个很好的表达式列表,并且还包含一个很好的测试程序以确保您的表达能够正常工作。