javascript - 正则表达式匹配 url 但不匹配超链接中的 url

标签 javascript regex

我正在尝试包装某些文本中的任何 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 之后的任何句号。

最佳答案

javascript doesn't seem to support negative look-behind ,您将不得不使用替换功能来欺骗它。 捕获 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>"
  });
}

参见 demo

编辑

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

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"))

查看demo

关于javascript - 正则表达式匹配 url 但不匹配超链接中的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863847/

相关文章:

javascript - 匹配所有以四个空格为前缀的行

c++ - Boost regex_replace 异常 : "...This exception is thrown to prevent "eternal"matches. .."偶尔抛出

c# - 使用正则表达式 C# 将表情符号替换为推文中的单词

javascript - 在三星智能电视上运行基于 Cordova/Phonegap 的应用程序

javascript - jquery (this).parent.hasClass 在动画中给出误报

javascript mocha,节点异常测试用例

javascript - 在已知符号之间提取字符串并将其分配为仅使用 javascript 的可重用变量

javascript - req.flash 不是函数 - 初始化顺序

javascript - 从 css 检索所有图像 url

java - 如何在模式编译时转义方括号?