0

テキスト内のhttpURLをアンカータグに変換するために使用される次のコードがあります。空白(または入力の開始/終了)で囲まれたhttpで始まるものを探しています

function linkify (str) {
    var regex = /(^|\s)(https?:\/\/\S+)($|\s)/ig;
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>$3')
}

// This works
linkify("Go to http://www.google.com and http://yahoo.com");

// This doesn't, yahoo.com doesn't become a link
linkify("Go to http://www.google.com http://yahoo.com");

それが機能しないのは、2つのリンクの間にスペースが1つしかない場合です。これは、2つのリンクの間のスペースを使用して両方のURLを一致させることができないためだと思います。最初の一致後、URLの後のスペースはすでに消費されています。

遊ぶには:http://jsfiddle.net/NgMw8/

誰かがこれを行う正規表現の方法を提案できますか?文字列を自分でスキャンして、正規表現の方法を探すことができます(または、自分で文字列をスキャンして自分で新しい文字列を作成する必要のない方法を探します。

4

3 に答える 3

2

ファイナルをキャプチャしないでください\s。このようにして、\s必要に応じて、2番目のURLが前のURLと一致します。

function linkify (str) {
    var regex = /(^|\s)(https?:\/\/\S+)/ig;
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>')
}

http://jsfiddle.net/NgMw8/3/

于 2012-09-15T00:34:32.177 に答える
1

$|\s次のように、 final を照合するときに肯定的な先読みを使用してください。

var regex = /(^|\s)(https?:\/\/\S+)(?=($|\s))/ig;
于 2012-09-15T00:55:19.177 に答える
0

URLにスタックしているhtml要素がある場合は何も機能しません...

同様の質問とその答えはここにあります

一部のソリューションでは、「test.com/anothertest?get=letsgo」のようなURLを処理し、http://を追加できます。

  • httpsおよびその他のTLDを処理するために回避策が実行される場合があります...
于 2012-09-17T00:02:34.157 に答える