我之前遇到过类似的问题,但没有一个问题有效。
我正在尝试使用锚标记替换页面上的所有网址,但只替换那些尚未包含锚标记的网址。
因此http://google.com应替换为
<a href="http://google.com">http://google.com</a>
但前提是它不在锚标签内。
有什么想法吗?
答案 0 :(得分:1)
我认为您需要进行两次操作。将源拆分为
PART1 <a href=...>blah></a> PART2 <a href=...>blah</a> PART3...
然后将PART1,PART2等中的<a href="url">
替换为url,然后将它们全部粘贴在一起。
在一个正则表达式中执行它将是一个令人头痛的问题,如果不是不可能的话,取决于你的方言。
答案 1 :(得分:1)
对于这样的工作,我通常建议人们使用代码而不是正则表达式,因为正则表达式非常混乱,非常快。但是,如果你想要一个正则表达式,这是一个可行的解决方案。请转到链接以全面了解我所使用的测试用例。
(?: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
}