2012-07-23 103 views
0

我有一個奇怪的問題正則表達式字符串替換在JavaScript中。我有這樣的正則表達式中可以包含多個網址(評論或交的,比如)一個要搜索的字符串的URL:JavaScript的URL搜索正則表達式

/(?:https?:\/\/|www\.)\S+/gi

但是我遇到了一個問題,它只會匹配一個URL ......除非沒有。它不穩定,但通常它只會匹配一個URL(不一定總是第一個)。以此字符串:

"Test 

http://google.com 
http://google.com 

http://google.com" 

它只會匹配第一個http://google.com實例。

的最終目標是鏈接到替換的URL:

str = str.replace(/(?:https?:\/\/|www\.)\S+/gi, '<a href="$&" target="_blank">$&</a>'); 

我用這個來獲取被匹配什麼更好的主意,什麼是不:

function getMatches(re, str) { 
    var matches = [], 
     match; 

    while ((match = re.exec(str)) !== null) { 
     matches.push(match[0]); 
    } 

    return matches; 
} 

有人知道我在這裏做錯了什麼?

編輯:它看起來像有什麼有趣的事情與我的數據導致的問題。

回答

0

試試這個,

str.replace(/(https?\:\/\/[^\s]+)/gi, '<a href="$1" target="_blank">$1</a>'); 
+0

我的錯誤,我實際上使用它,只是在問題中輸入錯誤。固定。 – coreyschram 2012-07-23 23:15:15

0

如果你只是想匹配的列表,您可以嘗試使用String.match而非RegExp.exec

它可以簡化getMatches到:

function getMatches(re, str) { 
    var matches = str.match(re); 
    return matches == null ? [] : matches; 
} 

或可能讓你放棄它:

var matches = str.match(/(?:https?:\/\/|www\.)\S+/gi) || []; 

你可能也想籤之類的工具RegexPal快速測試模式,such as yours

+0

實際上,使用g標誌處理正則表達式時需要它。每次連續的exec調用都會爲每個匹配返回一個結果數組(匹配,然後是每個捕獲的括號),因此您必須查看直到它返回null以獲得每個匹配。 – coreyschram 2012-07-24 18:51:01

+0

@coreyschram啊。抱歉。我正在考慮['match'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/match),它使用全局標誌將返回字符串中的所有匹配項。 – 2012-07-24 18:58:26