正则表达式仅使用锚点替换URL,如果尚未在锚点中

时间:2014-01-17 22:50:29

标签: javascript regex

我之前遇到过类似的问题,但没有一个问题有效。

我正在尝试使用锚标记替换页面上的所有网址,但只替换那些尚未包含锚标记的网址。

因此http://google.com应替换为

<a href="http://google.com">http://google.com</a>

但前提是它不在锚标签内。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我认为您需要进行两次操作。将源拆分为

PART1 <a href=...>blah></a> PART2 <a href=...>blah</a> PART3...

然后将PART1,PART2等中的<a href="url">替换为url,然后将它们全部粘贴在一起。

在一个正则表达式中执行它将是一个令人头痛的问题,如果不是不可能的话,取决于你的方言。

答案 1 :(得分:1)

对于这样的工作,我通常建议人们使用代码而不是正则表达式,因为正则表达式非常混乱,非常快。但是,如果你想要一个正则表达式,这是一个可行的解决方案。请转到链接以全面了解我所使用的测试用例。

http://regex101.com/r/kL3iL7

(?:http([s]?):\/\/)?((\w+[.])+\w+(\/\w*)*(\?[^\s]*)*)(?![^\s]*>)

替换

<a href="http\1://\2">\2</a>

我不保证这是完美的,但它确实处理了很多案件。如果有任何测试用例需要修复,请告诉我。

答案 2 :(得分:0)

如果您在客户端进行此操作,则可能需要通过遍历文档树

来执行此操作

查看文本节点(nodeName =“#text”),如果有以http / https开头的子字符串且父标记不是A,则将其替换为模式(<a href="\1">\1</a>等)

考虑这个开始

 // getting all tags where there is a text with 'http' which are not links
 var textTags = [].slice.call(document.getElementsByTagName('*'))
        .filter(function(n) { 
               return !n.children.length 
                  && n.nodeName !='A' && n.nodeName !='INPUT' 
                  && (n.innerHTML.indexOf('http') > -1) })

 for(var i in textTags) {
   // your code to replace links with whatever you want
 }