如何实现多词查找替换?优化仅支持单文本替换的现有代码
实现多词查找替换的代码修改方案
核心思路是把单组替换规则改成多组替换规则集合,通过正则表达式一次性匹配所有目标词并完成替换,既提升效率,又能灵活添加任意多组替换规则。
修改后的完整代码
var observer = new MutationObserver(onMutation); observer.observe(document, { childList: true, // 监听节点的添加/移除 subtree: true, // 监听所有后代元素 }); function onMutation(mutations, observer) { for (var i = 0, len = mutations.length; i < len; i++) { var added = mutations[i].addedNodes; for (var j = 0, node; (node = added[j]); j++) { replaceText(node); } } } function replaceText(el) { // 在这里定义所有需要替换的词:键是原文本,值是替换后的文本 const replacePairs = { "winter": "summer", "apple": "orange", "cat": "dog", // 可以继续添加更多替换规则 "old": "new" }; // 辅助函数:转义正则表达式中的特殊字符,避免匹配出错 function escapeSpecialChars(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // 生成匹配所有目标词的正则表达式,g表示全局替换 const targetRegex = new RegExp( Object.keys(replacePairs).map(escapeSpecialChars).join('|'), 'g' ); const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT); for (let node; (node = walker.nextNode());) { const originalText = node.nodeValue; // 用回调函数根据匹配到的内容自动替换成对应的值 const updatedText = originalText.replace(targetRegex, match => replacePairs[match]); if (originalText !== updatedText) { node.nodeValue = updatedText; } } }
关键修改说明
- 替换规则集合:用
replacePairs对象存储所有需要替换的词对,新增替换规则只需要在对象里添加键值对即可。 - 正则转义:通过
escapeSpecialChars函数处理目标词中的正则特殊字符(比如.,*等),避免替换逻辑出错。 - 全局匹配替换:生成包含所有目标词的正则表达式,一次遍历文本节点就能完成所有替换,比多次遍历效率更高。
- 灵活扩展:如果需要不区分大小写替换,只需要把正则的flags改成
'gi'即可。
内容的提问来源于stack exchange,提问作者XenLeaks
相关产品推荐
相关产品推荐

