Javascript 正则表达式匹配URL,但不匹配超链接中的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
<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"))