我认为使用客户端javascript突出显示是最佳选择。它可以节省您的服务器处理时间和带宽,更重要的是,保持html清洁和可用于那些不需要不必要标记的人,例如,打印或转换为其他格式时。
为了避免超时,只需将作业拆分为块并在setTimeout的线程函数中逐个处理它们。这是这种方法的一个例子
function hilite(terms, chunkSize) {
// prepare stuff
var terms = new RegExp("\\b(" + terms.join("|") + ")\\b", "gi");
// collect all text nodes in the document
var textNodes = [];
$("body").find("*").contents().each(function() {
if (this.nodeType == 3)
textNodes.push(this)
});
// process N text nodes at a time, surround terms with text "markers"
function step() {
for (var i = 0; i < chunkSize; i++) {
if (!textNodes.length)
return done();
var node = textNodes.shift();
node.nodeValue = node.nodeValue.replace(terms, "\x1e$&\x1f");
}
setTimeout(step, 100);
}
// when done, replace "markers" with html
function done() {
$("body").html($("body").html().
replace(/\x1e/g, "").
replace(/\x1f/g, "")
);
}
// let's go
step()
}
像这样使用:
$(function() {
hilite(["highlight", "these", "words"], 100)
})
如果您有疑问,请告诉我。