在Chrome扩展程序中使用Treewalker替换文本

时间:2013-11-09 02:26:24

标签: javascript google-chrome-extension

我在下面找到了如何用Treewalker替换文本的示例:Javascript .replace command replace page text?

// create a TreeWalker of all text nodes
var allTextNodes = document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT),
// some temp references for performance
tmptxt,
tmpnode,
// compile the RE and cache the replace string, for performance
cakeRE = /cake/g
replaceValue = "pie";

// iterate through all text nodes
while (allTextNodes.nextNode()) {
tmpnode = allTextNodes.currentNode;
tmptxt = tmpnode.nodeValue;
tmpnode.nodeValue = tmptxt.replace(cakeRE,replaceValue);
}

是否可以修改它以便它可以检查和替换多个单词以及不区分大小写?

1 个答案:

答案 0 :(得分:0)

对于不区分大小写的模式,可以使用i标志。 [<强> more info

如果您想用一个特定单词替换多个单词,那么只需修改正则表达式模式:

cakeRE = /word1|word2|.../gi;

如果要用不同的替换值替换每个单词,可以创建一组相应的模式替换对并对其进行迭代。 E.g:

...
patterns = [/cake/gi, /muffin/gi, /pancake/gi];
replacements = ["pie", "brownie", "cheese-cake"];
...
tmpnode = allTextNodes.currentNode;
patterns.forEach(function(pattern, idx) {
    tmpnode.nodeValue = tmpnode.nodeValue.replace(pattern, replacements[idx]);
});
...

或者,您也可以将replace变体与函数一起用作其第二个参数。 [<强> more info

...
replDict = {
    "cake": "pie",
    "muffin": "brownie",
    "pancake": "cheese-cake"
};
pattern = new RegExp(Object.keys(replDict).join("|"), "gi");
...
tmpnode = allTextNodes.currentNode;
tmpnode.nodeValue = tmpnode.nodeValue.replace(pattern, function(match) {
    return replDict[match];
});
...