在javascript中没有href的字符串替换

时间:2011-03-01 10:30:20

标签: javascript regex

<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 =“”。如何为此编写正则表达式?

2 个答案:

答案 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属性除外)节点