<html>
<head>
<title>Test</title>
</head>
<body>
<a href="hello.html">hello</a>
<script>
var str=document.body.innerHTML;
document.body.innerHTML=str.replace(/hello/g, "hi");</script>
</body>
</html>
在此代码中,hello.html和hello将更改hi.html和hi。我不想替换href =“”。如何为此编写正则表达式?
答案 0 :(得分:1)
以下正则表达式取代你想做的事情:
<script>
var str=document.body.innerHTML;
document.body.innerHTML=str.replace(/(>[^<]*)hello/g, "\1hi");
</script>
但我认为它仍然很脆弱,并且在.innerHTML
中使用正则表达式取代的任何解决方案都将是......请记住,在尝试解决涉及html / xml解析的问题时,正则表达式总是一个hacky解决方案。
答案 1 :(得分:0)
你需要什么?当我说要替换文档的所有文本内容时,我猜对了吗?
在这种情况下,我建议从DOM中获取所有内容节点的列表(请参阅this question接受的答案有两种方法,一种是使用jQuery,另一种是不使用)。
然后,您可以应用您的函数来更新每个文本节点的内容:
var textNodes = getTextNodesIn(el);
for (var i = 0; i < textNodes.length; i += 1) {
textNodes[i].innerHTML = textNodes[i].innerHTML.replace(/hello/g, "hi");
}
这会使所有HTML属性不受影响。如果您还要调整这些(当然,除了任何href
属性),您可以展开getTextNodes
函数以在返回的列表中包含属性(href
属性除外)节点