我有以下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的确切文字吗?例如,我希望它只匹配“办公室”而不是“官员”。
谢谢!
答案 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只提取整个文本,代码中的实际字符串搜索发生在上面的语句中。