我正在尝试包装某些文本中的任何 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 之后的任何句号。
由于javascript 似乎不支持负向后查找,因此您必须使用替换函数来欺骗它。\n捕获href(也许您还应该考虑src):
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}\nRun Code Online (Sandbox Code Playgroud)\n\n查看演示
\n\n编辑
\n\n一个“更好”的版本,只会替换实际文本节点中的链接:
\n\nfunction 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"))\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x8b\n查看演示
\n