0

JavaScript での正規表現文字列の置換に関して奇妙な問題が発生しています。この正規表現を使用して、複数の URL (たとえば、コメントや投稿) を含む可能性のある文字列内の URL を検索します。

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

ただし、一致しない場合を除いて、1 つの URL のみに一致するという問題が発生しています。不安定ですが、一般的には 1 つの 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

正常に動作します:http ://jsfiddle.net/pPR2A/

于 2012-07-23T23:05:07.223 に答える
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 に答える