Javascript正则表达式将URL替换为链接,但不在嵌入(或img)标记中

Javascript正则表达式将URL替换为链接,但不在嵌入(或img)标记中,javascript,regex,Javascript,Regex,我目前正在使用以下代码,搜索页面上的a div以查找URL,并将其替换为a标记 然而,当我们在div中嵌入标签时,它会弄乱这些标签中的链接 function replaceURLWithHTMLLinks(text) { return text.replace(/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim,'<a href="$&" class="my_link" target="_blank">$&</a>

我目前正在使用以下代码,搜索页面上的a div以查找URL,并将其替换为a标记

然而,当我们在div中嵌入标签时,它会弄乱这些标签中的链接

function replaceURLWithHTMLLinks(text) { 
    return text.replace(/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim,'<a href="$&" class="my_link" target="_blank">$&</a>').replace(/([^\/])(www[^ <]+(\b|$))/gim,'$1<a href="http://$2" class="my_link" target="_blank">$2</a>');
}

$(document).ready(function(){
    var htmlStr = $("div.content-a").html();
    var htmlStrAfter = replaceURLWithHTMLLinks(htmlStr);
    $("div.content-a").html(htmlStrAfter);
});
函数replaceurlwithhtmlinks(text){

返回文本。替换(/(ftp | http | https |文件):\/\/[\S]+(\b |$)/gim',)。替换(/([^\/])(www[^+1到Johannes说的内容

    $(document).ready(function(){
       $('div.content').contents().filter(function() {
         return this.nodeType == 3;
       }).each(function(){
             this.nodeValue.replace(/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim,'<a href="$&" class="my_link" target="_blank">$&</a>').replace(/([^\/])(www[^ <]+(\b|$))/gim,'$1<a href="http://$2" class="my_link" target="_blank">$2</a>');
       });
    });
$(文档).ready(函数(){
$('div.content').contents().filter(函数(){
返回this.nodeType==3;
}).each(函数({

this.nodeValue.replace(/(ftp | http | https |文件):\/\/[\S]+(\b |$)/gim',).replace(/(^\/])(www[^可能,您应该按照建议使用DOM。但为了使您的regexp按需要工作,您应该在它前面加上
(?:^[^''))
。这意味着匹配行的开头或匹配除
之外的任何字符。”
。因此,您的第一个regexp将如下所示:

/(?:^|[^"'])(ftp|http|https|file):\/\/[\S]+(\b|$)/gim  
而且你对
replace
方法的链接很难看。如果你将方法调用拆分到不同的行,代码的可读性会更好

更新:为了跳过第一个多余字符,您可以使用
$1
而不是
$&
,并且您的regexp必须更改为:

/(?:^|[^"'])((ftp|http|https|file):\/\/[\S]+(\b|$))/gim  

如果你有JavaScript,为什么不在DOM上而不是HTML文本上工作呢?Regex HTML解析已经够麻烦的了,JS也没有后顾之忧,这使得你的需求变得更加糟糕。即使我将“div.content”更改为“div.content-a”,我似乎也无法实现这一点。这个div通常会包含文本和几个div。但是它是lso包含一个带有嵌入标记的表,以及一个在alt中带有URL的img标记(我们系统的怪癖)。那么它一定不能工作。我假设,因为除非你的选择器不匹配任何东西,否则应该没有区别…发生了什么事,你会得到任何错误吗?顺便说一句-我jsut使用了你的正则表达式-我假设它工作,除了捕获标记中的URL,我的代码只会尝试错过标记-如果正则表达式本身不工作,那么可能会重新格式化我Rorick从我能说的话中得到了一些很好的建议,但我不是regex忍者:-)regex工作了,但是在你的代码中它似乎过滤了所有标记。div中的内容不包含在任何标记中,只是带有可选内联嵌入标记的纯文本。这不应该对标记做任何事情…
contents()
将获取选择器的所有子级,包括文本节点(文本节点是您想要的),然后if语句应该测试该节点是否为文本节点(nodeType=3=text)…或者至少应该…我将其更改为使用jquery的筛选方法,以查看这是否有区别。