2011-03-28 39 views
6

我必須找到與正則表達式文本中的第一網址:正則表達式來找到URL文本

例如:

I love this website:http://www.youtube.com/music it's fantastic 

[ es. http://www.youtube.com/music] text 
+0

這是你的問題的PHP版本:從字符串中提取URL](http://stackoverflow.com/questions/4390556/extract-url-from-string) – 2011-03-28 16:01:36

回答

4

你可以用」用正則表達式完美地做到這一點。您可能對this blog post感興趣。 Regex Guru有一些信息,但即使那些看起來很脆弱。您需要在正則表達式之外進行其他檢查以捕獲邊緣案例。

+1

我認爲這將是更準確的說你不能完全*這樣做,你不能用正則表達式*單獨做*。 FWIW,Stack Overflow的WMD編輯器使用了類似的解決方案,以便Jeff Atwood在第一個鏈接中描述的解決方案使用正則表達式和各種檢查的組合。就像我說的那樣,它不可能是完美的,但是由於缺乏更好的解決方案,您可能會使用與99.9%的時間匹配的東西。 – 2011-03-28 16:14:42

+0

有趣的東西,但我會說,毛毯評論「不能做到這一點」有點強。更像是,「可以做99%的時間」:) – 2011-03-28 16:14:53

+0

我同意你的意見。我編輯了答案來反映這一點。 – syrion 2011-03-28 16:16:03

10

我在去年調查了這個問題,並開發了一個您可能想看的解決方案 - 請參閱:URL Linkification (HTTP/FTP)此鏈接是Javascript解決方案的測試頁面,其中包含很多難以鏈接的URL示例。

我正則表達式的解決方案,對於PHP和JavaScript編寫的 - 不是簡單的(但也不是問題,因爲它證明。)有關詳細信息,我也會推薦閱讀:

The Problem With URLs由傑夫·阿特伍德和
An Improved Liberal, Accurate Regex Pattern for Matching URLs通過約翰格魯伯

以下Jeff的博客文章的評論是,如果你想這樣做的權利一定要讀...

注意,這個問題被問了很多。也許下次做搜索:)

+0

感謝您提供這些信息,我發現它非常有用。任何機會,你想出了一個類似的強大的regEx,找到沒有領先的'http://'的網址,如'www.example.com'?. – mksuth 2011-08-25 21:38:48

+1

@mksuth - 在上面的鏈接中查看John Gruber的正則表達式。它會捕獲沒有'http://'的URL。 – ridgerunner 2011-08-28 05:26:09

2

識別URL是非常棘手的,因爲它們通常被標點符號包圍,並且用戶經常不使用完整的URL形式。現在有很多JavaScript函數可以用超鏈接代替URL,但我找不到一個和基於Python的Web框架Django中的urlize過濾器一樣好的JavaScript函數。因此,我將Django的urlize函數移植到JavaScript中:https://github.com/ljosa/urlize.js

實際上,在您的示例中實際上不會選擇該URL,因爲URL的前面有一個冒號。但是,如果我們修改的例子一點:

urlize("I love this website: http://www.youtube.com/music it's fantastic", true, true) 
=> 'I love this website: <a href="http://www.youtube.com/music" rel="nofollow">http://www.youtube.com/music</a> it&#39;s fantastic"' 

注意第二個參數,如果屬實,插入rel="nofollow"第三個參數,如果屬實,報價有在HTML特殊含義的字符。

0

我使用這個表達式::)(其翻譯ABNF)

[a-zA-Z]([a-zA-Z]|[0-9]|\+|\-|\.)*:\/\/((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:)*@)?(\[((([0-9A-Fa-f]{1,4}:){6}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|::([0-9A-Fa-f]{1,4}:){5}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|([0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){4}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){3}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){2}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|v[0-9A-Fa-f]\.(([a-zA-Z]|[0-9]|-|\.|_|~)|[!$&'\(\)\*\+,;=]|:))\]|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=])*)(:[0-9]*)?(((\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*|\/((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*)?|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*))?\/?(\?((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?(\#((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)|\/|\?)*)? 
0

您可以使用下面的正則表達式,用於提取任何類型的URL的消息來了。

String regex = "(http(s)?:\/\/.)?(www\.)?[[email protected]:%._\+~#=]{2,256}\.[a-z]{2,6}\b([[email protected]:%_\+.~#?&/=]*)"; 
+0

較早的一個不工作? – The90sArtist 2017-05-17 11:41:51