正则表达式匹配超链接中的网址但不匹配网址

Bas*_*e33 7 javascript regex

我正在尝试包装某些文本中的任何 url 并将其转换为超链接......但我不想包装已经由超链接包装的 url。

例如:

<a href="http://twitter.com">Go To Twitter</a>
here is a url http://anotherurl.com
Run Code Online (Sandbox Code Playgroud)

以下代码:

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>");
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

<a href="<a href='http://twitter.com/twitter'>http://twitter.com/twitter</a>">@BIR</a>
<a href="http://anotherurl.com">http://anotherurl.com</a>
Run Code Online (Sandbox Code Playgroud)

如何修改正则表达式以排除已经超链接的 url?

谢谢

回答:

新方法是:

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

上面的代码按要求运行。我从评论中的链接修改了正则表达式,因为它包含一个错误,其中包含句号,它现在排除了完整 url 之后的任何句号。

Jul*_*Ch. 3

由于javascript 似乎不支持负向后查找,因此您必须使用替换函数来欺骗它。\n捕获href(也许您还应该考虑src):

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

查看演示

\n\n

编辑

\n\n

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

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

\xe2\x80\x8b\n查看演示

\n