2011-08-26 116 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有一個很好的表達式列表,並且還包含一個很好的測試程序以確保您的表達能夠正常工作。