2011-08-28 69 views
0

我使用約翰格魯伯在此daringfireball article中描述的模式來自動鏈接用戶註釋中的URL。爲什麼這個URL模式不匹配?

我正在使用它與PHP匹配的URL,並希望它匹配沒有www沒有www單個頂級域名,但它似乎並沒有工作。

這裏的模式(可以進行更詳細的在文章上面看到的):

$pattern = '#(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»「」‘’]))#'; 

具體來說,我期待在這個特定的子模式:[a-z0-9.\-]+[.][a-z]{2,4}

此子模式獨立工作,但作爲較大圖案的一部分,它不匹配google.com

+0

即使你可以得到它匹配'google.com',它肯定不會匹配,例如'annebjerggaard.museum'。 –

+2

你知道你必須逃避一切。人物對不對? –

+0

點在方括號內,所以OP是可以的。 –

回答

2

[a-z0-9.\-]+[.][a-z]{2,4}作品如您所願,但該模式的其餘部分至少需要1以下性格:

google.com/ 
google.com?lang=en-us 
google.com#!foo/bar 

您可以嘗試允許尾是可選的,但它可能反過來給你誤報,而不是排除假陰性:

$pattern = '#...「」‘’])?)#'; # '...' for brevity 
#     ^
+0

太棒了,謝謝。我最終做了你提到的事情,而不是匹配'[a-z] {2,4}',我只是指定了一些域名後綴,以免匹配誤報。 – Calvin

0

工作對我來說:

http://regexr.com?2uica

你肯定有什麼在你的PHP被絆倒你嗎?

編輯

這是因爲整個模式預計在域名前找到的東西,像http://www

+0

子模式可以獨立工作,但不會在它是大模式的一部分時嘗試。 – Calvin

+0

查看我上面的評論@calvin –

相關問題