2013-07-18 47 views
2

我一直在使用John Gruber的巨大URL正則表達式來匹配非結構化文本消息中的URL。它大部分時間都是非常有效的,但是我發現了一個性能會嚴重下降的情況,這取決於括號內的內容。爲Javascript優化Gruber URL正則表達式

// The URL matching regex. 
var urls = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/ig; 

// An example URL that has horrible performance in some modern browsers 
var url = "www.linkedin.com/people/~:(id,first-name,last-name,email-address,picture-url,phone-numbers,public-profile-url)"; 
url.replace(urls, "<a href='$1'>$1</a>"); 

原來的職位包含多評論正則表達式的版本,可以在這裏找到:

http://daringfireball.net/2010/07/improved_regex_for_matching_urls

這裏有一個的jsfiddle,做解決問題的一些表現時間:

http://jsfiddle.net/xMePg/4/

及其對Chrome的輸出:

Gruber URL Regex Performance 

www.a.com/:(aaaaaaaaaaaaaa)1 MS 
www.a.com/:(aaaaaaaaaaaaaaa)0 MS 
www.a.com/:(aaaaaaaaaaaaaaaa)0 MS 
www.a.com/:(aaaaaaaaaaaaaaaaa)2 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaa)3 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaa)5 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaa)11 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaa)22 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaaa)44 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaaaa)87 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaaaaa)174 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaaaaaa)348 MS 
www.a.com/:(aaaaaaaaaaaaaaaaaaaaaaaaaa)704 MS 
www.a.com/:(aaaaaaaaaaaa)(aaaaaaaaaaaaa)0 MS 

有人能找出什麼可能會造成一些現代瀏覽器在比賽次數的增加?我想要麼導致匹配失敗,要麼以某種方式優化正則表達式。

回答

1

刪除匹配括號的要求使其更快。應該適用於絕大多數網址...

m/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)\S+(?:[^\s`!\[\]{};:'".,?«»「」‘’]))/ig; 
+0

對我來說夠好。我會通過鎖定瀏覽器來獲得一些奇怪的結果。 – justind