2012-07-23 110 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