0

我在 JavaScript 中替换正则表达式字符串时遇到了一个奇怪的问题。我有这个正则表达式来搜索可能包含多个 URL(例如评论或帖子)的字符串中的 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;
}

有人知道我在这里做错了什么吗?

编辑:看起来我的数据发生了一些有趣的事情导致了这个问题。

4

3 回答 3

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 之类的工具来快速测试模式,例如您的 .

于 2012-07-23T23:44:53.953 回答
0

尝试这个,

str.replace(/(https?\:\/\/[^\s]+)/gi, '<a href="$1" target="_blank">$1</a>');
于 2012-07-23T23:10:36.907 回答
0

工作正常:http: //jsfiddle.net/pPR2A/

于 2012-07-23T23:05:07.223 回答