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,做解決問題的一些表現時間:
及其對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
有人能找出什麼可能會造成一些現代瀏覽器在比賽次數的增加?我想要麼導致匹配失敗,要麼以某種方式優化正則表達式。
對我來說夠好。我會通過鎖定瀏覽器來獲得一些奇怪的結果。 – justind