【发布时间】:2014-01-17 22:50:29
【问题描述】:
我之前看到过类似的问题,但没有一个有有效的解决方案。
我正在尝试用锚标记替换页面上的所有 url,但只有那些不在锚标记中的 url。
所以http://google.com应该替换为
<a href="http://google.com">http://google.com</a>
但前提是它尚未在锚标记内。
有什么想法吗?
【问题讨论】:
标签: javascript regex
我之前看到过类似的问题,但没有一个有有效的解决方案。
我正在尝试用锚标记替换页面上的所有 url,但只有那些不在锚标记中的 url。
所以http://google.com应该替换为
<a href="http://google.com">http://google.com</a>
但前提是它尚未在锚标记内。
有什么想法吗?
【问题讨论】:
标签: javascript regex
我认为您需要进行两次操作。将源码拆分成
PART1 <a href=...>blah></a> PART2 <a href=...>blah</a> PART3...
然后在 PART1、PART2 等中将 url 替换为 <a href="url">,然后将它们全部粘贴在一起。
根据您的方言,在单个正则表达式中执行此操作将是一件令人头疼的事情,如果不是不可能的话。
【讨论】:
对于这样的工作,我通常建议人们使用代码而不是正则表达式,因为正则表达式变得非常混乱,非常快。但是,如果您确实想要一个正则表达式,这里是一个可行的解决方案。请转到链接以全面了解和查看我使用的测试用例。
(?:http([s]?):\/\/)?((\w+[.])+\w+(\/\w*)*(\?[^\s]*)*)(?![^\s]*>)
替换
<a href="http\1://\2">\2</a>
我不保证这是完美的,但它确实可以处理很多情况。如果有任何测试用例需要修复,请告诉我。
【讨论】:
<div>http://example.com</div>) 时,它还添加锚点,我对其进行了轻微修改:(?:http([s]?):\/\/)?((\w+[.])+\w+(\/\w*)*(\?[^\s]*)*)(?![^\s<]*>)
如果您在客户端执行此操作,则可能值得通过遍历文档树来执行此操作
查看文本节点(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
}
【讨论】: