在文档中全局更改文本节点内容

时间:2016-09-12 12:36:33

标签: javascript greasemonkey

所以我有这个脚本,我用来改变JS中的文本节点内容。在Greasemonkey中使用这个脚本:

(function() {
  var replacements, regex, key, textnodes, node, s; 

  replacements = { 

    "facebook": "channelnewsasia",
    "Teh": "The",
    "TEH": "THE",
    };

regex = {}; 
for (key in replacements) { 
    regex[key] = new RegExp(key, 'g'); 
} 

textnodes = document.evaluate( "//body//text()", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 

for (var i = 0; i < textnodes.snapshotLength; i++) { 
    node = textnodes.snapshotItem(i); 
    s = node.data; 
    for (key in replacements) { 
        s = s.replace(regex[key], replacements[key]); 
    } 
    node.data = s; 
} 

})();

哪个效果很好。

除了我的问题,我正在尝试将值0更改为75.但是它也会更改页面中包含在日期中的其他0,例如今天的日期。

这不是我想要的。我只想让它改变自己的0。我该怎么做?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

嗯,你需要正则表达式。您的脚本支持正则表达式,您只需将其放在所需替换列表中即可。

匹配单个零的正则表达式如下所示:(?:[^0-9]|^)(0)(?:[^0-9]|$)。它的工作原理是断言非数字必须在零之前/之后 - 或者字符串开头/结尾。

您可以将其添加到替换列表中:

replacements = { 
    "(?:[^0-9]|^)(0)(?:[^0-9]|$)": "75",
};

或者,如果零总是用空格分隔,请使用以下表达式:\b0\b

您的代码备注:

  • 请记住,对于您的系统,您必须将所有替换模板视为正则表达式。因此,当您想要按字面意思处理这些字符时,请不要忘记在替换中转义([.等字符。
  • 在自调用表达式中包装整个用户脚本是不必要的,用户脚本变量作用域已在全局范围内隐藏。