Javascript 正则表达式匹配URL,但不匹配超链接中的URL

Javascript 正则表达式匹配URL,但不匹配超链接中的URL,javascript,regex,Javascript,Regex,我试图包装任何网址,是在一些文本,并把它变成一个超链接。。。但是我不想包装一个已经被超链接包装的url 例如: <a href="http://twitter.com">Go To Twitter</a> here is a url http://anotherurl.com 这是一个网址http://anotherurl.com 以下代码: function replaceURLWithHTMLLinks(text) { var exp = /(\b(http

我试图包装任何网址,是在一些文本,并把它变成一个超链接。。。但是我不想包装一个已经被超链接包装的url

例如:

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

这是一个网址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>");
}
函数replaceurlwithhtmlinks(文本){
var exp=/(\b(https?| ftp |文件):\/\/[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig;
返回文本。替换(exp,“”);
}
提供以下输出:

<a href="<a href='http://twitter.com/twitter'>http://twitter.com/twitter</a>">@BIR</a>
<a href="http://anotherurl.com">http://anotherurl.com</a>
“>@BIR
如何修改正则表达式以排除已超链接的URL?

谢谢

答复:

新方法是:

function replaceURLWithHTMLLinks(text) {
  var exp = /(?:^|[^"'])((ftp|http|https|file):\/\/[\S]+(\b|$))/gi
  return text.replace(exp, " <a href='$1'>$1</a>");
}
函数replaceurlwithhtmlinks(文本){
var exp=/(?:^ |[^”')((ftp | http | https |文件):\/\/[\S]+(\b |$)/gi
返回文本。替换(exp,“”);
}
上述代码按要求运行。我从注释中的一个链接修改了正则表达式,因为它包含一个bug,其中包含了句号,现在它排除了在完整url之后出现的任何句号。

因为,您必须使用替换函数来欺骗它。 捕获<代码> HREF (也许你也应该考虑<代码> SRC ):

函数repl(文本){
var exp=/((href | src)=[“].](\b(https?| ftp |文件):\/\/[-A-Z0-9+&@#\/%?=~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig;
返回text.replace(exp,function(){
返回参数[1]?
参数[0]:
""
});
}

编辑

“更好”的版本只会替换实际文本节点中的链接:

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"))
函数repl(节点){
var exp=/(\b(https?| ftp | file):\/\/[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/i;
var nodes=node.childNodes;

对于(var i=0,m=nodes.length;iYou不应该使用正则表达式来解析html。类似于.And.Or.极好!谢谢nnnnnn。我今天早上确实搜索了,但很明显我的搜索短语与任何有用的内容都不匹配。谢谢分享!不客气。我通过向下扫描“相关”列表找到了这些内容“本页右下角的主题…有以下内容:
(?:^ |[^”])
我想您只需要
[^”]
并删除分组。无需检测它是否是字符串的开头,因为那里肯定不会有任何其他字符?而且,这仍然会检测到有人在锚定标记的文本中添加href?回答真不错。我找到了另一个函数,但找到了一个很好的答案
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"))