不久前我发布了this如果文本与我的数据库中的术语列表匹配,是否可以将文本转换为 HTML 链接。
我有一个相当大的术语列表 - 大约 6000 个。
accepted answer在那个问题上非常棒,但从未使用过 XPath,当问题开始出现时我不知所措。有一次,在摆弄代码之后,我以某种方式设法向我们的数据库添加了超过 40,000 个随机字符——其中大部分需要手动删除。从那时起,我对这个想法失去了信心,更简单的 PHP 解决方案根本不足以有效地处理大量数据和术语。
我的下一个解决方案尝试是编写一个 JS 脚本,该脚本在页面加载后检索术语并将它们与页面上的文本进行匹配。
This answer有一个我想尝试的想法。
我会使用 AJAX 从数据库中检索术语,构建如下对象:
var words = [
{
word: 'Something',
link: 'http://www.something.com'
},
{
word: 'Something Else',
link: 'http://www.something.com/else'
}
];
构建对象后,我会使用这种代码:
//for each array element
$.each(words,
function() {
//store it ("this" is gonna become the dom element in the next function)
var search = this;
$('.message').each(
function() {
//if it's exactly the same
if ($(this).text() === search.word) {
//do your magic tricks
$(this).html('<a href="' + search.link + '">' + search.link + '</a>');
}
}
);
}
);
现在,乍一看,这里有一个主要问题:有 6,000 个术语,这段代码是否足够有效地完成我正在尝试做的事情?。
一个选项可能是在与 AJAX 通信的 PHP 脚本中执行一些开销。例如,我可以发送帖子的 ID,然后 PHP 脚本可以使用 SQL 语句从帖子中检索所有信息并将其与所有 6,000 个术语进行匹配。然后对 JavaScript 的返回调用可以简单地进行匹配条款,这将显着减少上述 jQuery 匹配的数量(最多大约 50 个)。
我对脚本在用户浏览器上“加载”几秒钟没有问题,只要它不影响他们的 CPU 使用率或类似情况。
所以,两个问题合二为一:
- 我可以完成这项工作吗?
- 我可以采取哪些措施使其尽可能高效?
提前致谢
最佳答案
您可以在插入时缓存结果。
基本上,当有人插入新帖子时,您不是将其插入数据库,而是运行替换过程。
如果你的帖子在数据库中是这样存储的
Table: Posts
id post
102 "Google is a search engine"
您可以创建另一个表
Table: cached_Posts
id post_id date_generated cached_post
1 102 2012-10-10 <a href="http://google.com">Google</a> is a search engine"
当您检索帖子时,首先检查它是否存在于 cached_Posts 表中。
您应该保留原始关键字的原因可能是您可能会添加一个新的关键字来替换。您所要做的就是重新制作缓存。
通过这种方式,不需要客户端 JS,并且每个帖子只需执行一次,因此您的结果应该会很快出现。
关于javascript - 使用大量术语,搜索页面文本并用链接替换单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828394/