7

テキスト内の URL をラップしてハイパーリンクに変換しようとしていますが、既にハイパーリンクでラップされている URL をラップしたくありません。

例えば:

<a href="http://twitter.com">Go To Twitter</a>
here is a url http://anotherurl.com

次のコード:

function replaceURLWithHTMLLinks(text) {
  var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
  return text.replace(exp, "<a href='$1'>$1</a>");
}

次の出力が得られます。

<a href="<a href='http://twitter.com/twitter'>http://twitter.com/twitter</a>">@BIR</a>
<a href="http://anotherurl.com">http://anotherurl.com</a>

すでにハイパーリンクされている URL を除外するように正規表現を変更するにはどうすればよいですか?

ありがとう

答え:

新しい方法は次のとおりです。

function replaceURLWithHTMLLinks(text) {
  var exp = /(?:^|[^"'])((ftp|http|https|file):\/\/[\S]+(\b|$))/gi
  return text.replace(exp, " <a href='$1'>$1</a>");
}

上記のコードは必要に応じて機能します。コメントのリンクから正規表現を変更しました。これには完全な URL の後に来る完全な停止が含まれるバグが含まれていたためです。

4

1 に答える 1

3

JavaScript は否定的な後読みをサポートしていないように見えるため、replace 関数を使用してそれをだます必要があります。をキャプチャしhrefます(おそらくあなたも考慮する必要がありますsrc):

function repl(text) {
  var exp = /((href|src)=["']|)(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
  return text.replace(exp, function() {
    return  arguments[1] ? 
            arguments[0] : 
            "<a href=\"" + arguments[3] + "\">" + arguments[3] + "</a>"
  });
}

デモを見る

編集

実際のテキストノードのリンクのみを置き換える「より良い」バージョン:

function repl(node) {
  var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
  var nodes=node.childNodes;
  for (var i=0, m=nodes.length; i<m; i++){
    var n=nodes[i];
    if (n.nodeType==n.TEXT_NODE) {
      var g=n.textContent.match(exp);
      while(g) {
        var idx=n.textContent.indexOf(g[0]);
        var pre=n.textContent.substring(0,idx);
        var t=document.createTextNode(pre);
        var a=document.createElement("a");
        a.href=g[0];
        a.innerText=g[0];
        n.textContent = n.textContent.substring(idx+g[0].length);
        n.parentElement.insertBefore(t,n);
        n.parentElement.insertBefore(a,n);
        g=n.textContent.match(exp);
      }
    }
    else {
      repl(n);
    }
  }
}

var r=repl(document.getElementById("t"))

デモを見る

于 2012-08-08T12:18:15.927 に答える