如果在某個地方回答了此問題,但是像所有內容一樣,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(目前發現)
如果有人能夠用正則表達式來幫助我們,那太棒了。 謝謝
不是一個真正的解決方案,而是讓您的正則表達式更易於閱讀:您可以使用除/以外的分隔符作爲正則表達式,然後您不必在正則表達式中轉義斜線。 –
你的正則表達式很簡單,它應該匹配'luser @ example.com.au'就好 - 你確定它沒有? – tripleee