【问题标题】:regex replace urls with anchors ONLY if not already in anchors正则表达式仅在锚点中没有的情况下用锚点替换 url
【发布时间】:2014-01-17 22:50:29
【问题描述】:

我之前看到过类似的问题,但没有一个有有效的解决方案。

我正在尝试用锚标记替换页面上的所有 url,但只有那些不在锚标记中的 url。

所以http://google.com应该替换为

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

但前提是它尚未在锚标记内。

有什么想法吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

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

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

    然后在 PART1、PART2 等中将 url 替换为 &lt;a href="url"&gt;,然后将它们全部粘贴在一起。

    根据您的方言,在单个正则表达式中执行此操作将是一件令人头疼的事情,如果不是不可能的话。

    【讨论】:

    • 非常感谢!我按照您的建议采用了这种方法并且能够解决它。
    【解决方案2】:

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

    http://regex101.com/r/kL3iL7

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

    替换

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

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

    【讨论】:

    • 这是一个很好的答案,非常适合我的问题。非常感谢!当链接后跟一个尾随结束标记 (&lt;div&gt;http://example.com&lt;/div&gt;) 时,它还添加锚点,我对其进行了轻微修改:(?:http([s]?):\/\/)?((\w+[.])+\w+(\/\w*)*(\?[^\s]*)*)(?![^\s&lt;]*&gt;)
    【解决方案3】:

    如果您在客户端执行此操作,则可能值得通过遍历文档树来执行此操作

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

    考虑这个开始

     // 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
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多