在脚本中,我有这行:

var ReplacingScope = document.querySelector( "body" );
let Regexp = new RegExp("fdp", 'gi');
ReplacingScope.innerText = ReplacingScope.innerText.replace( Regexp,"pdf");

它可以满足我的要求,即将所有的fdp出现都替换为pdf,但同时也删除了html标签。
例如,我希望它这样做:

<body>
<div id="test">fdp</div>
</body>

变成

<body>
<div id="test">pdf</div>
</body>

我不想使用innerHTML属性,因为它可能会导致错误,更改节点ID,类等。
有没有一种方法可以在保留所有html标签的同时仅编辑正文文本?
谢谢

最佳答案

据我所知,在维护DOM树的同时,不可能一次性进行这样的查找和替换。

一种解决方案是手动遍历DOM并在每个文本节点中进行文本替换,但这不适用于匹配跨越多个节点的文本。

function replace() {
  const regex = /is|am|123456/gi;
  const el = document.querySelector('#box');
  const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);

  while (walker.nextNode()) {
    const node = walker.currentNode;
    node.nodeValue = node.nodeValue.replace(regex, '***');
  }
}
<button onclick="replace()">Replace</button>

<div id="box">
  <p>This is some <strong>sample</strong> text.</p>
  <p>123456 123<strong>456</strong> <em>123456</em></p>
</div>

07-24 16:39