突出显示精确文本匹配

时间:2016-11-17 17:23:34

标签: javascript jquery userscripts

我有以下java用户脚本:

function highlightWord(word) {
var xpath = "//text()[contains(., '" + word + "')]";
var texts = document.evaluate(xpath, document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (n = 0; n < texts.snapshotLength; n++) {
    var textNode = texts.snapshotItem(n);
    var p = textNode.parentNode;
    var a = [];
    var frag = document.createDocumentFragment();
    textNode.nodeValue.split(word).forEach(function(text, i) {
        var node;
        if (i) {
            node = document.createElement('span');
            node.style.backgroundColor = 'lightgreen';
            node.appendChild(document.createTextNode(word));
            frag.appendChild(node);
        }
        if (text.length) {
            frag.appendChild(document.createTextNode(text));
        }
        return a;
    });
    p.replaceChild(frag, textNode);
    }
}
highlightWord('office');

有人能帮我找到一个解决方案,只匹配我添加的highlightWord的确切文字吗?例如,我希望它只匹配“办公室”而不是“官员”。

谢谢!

2 个答案:

答案 0 :(得分:0)

这个答案

https://stackoverflow.com/a/2994336/2707021

应该有所帮助。基本上,您需要将单词边界应用于此行上的模式匹配字符串

var xpath = "//text()[contains(., '" + word + "')]";

答案 1 :(得分:0)

您需要更改代码的以下行

textNode.nodeValue.split(word).forEach(function(text, i) {

进入如下所示的那个。这将突出显示你提到的那个词。

textNode.nodeValue.split(RegExp("\\b" + word + "\\b")).forEach(function (text, i) {

XPath只提取整个文本,代码中的实际字符串搜索发生在上面的语句中。