用php&替换文本中的关键字MySQL的

时间:2010-04-14 09:36:47

标签: php mysql preg-replace str-replace

我有一个包含超过100万条新闻的档案的新闻网站。 我创建了一个包含大约3000个条目的单词定义数据库,由单词定义对组成。

我想要做的是在新闻中每次出现这些词语的旁边添加一个定义。 我无法进行静态更改,因为我可以每天添加一个新关键字,因此我可以实时或缓存。

问题是,str_replacepreg_replace在文本中搜索3千个关键字并替换它们会非常慢。

有没有快速的选择?

3 个答案:

答案 0 :(得分:1)

str_replace是非常活泼的,据我所知,你会发现最快的PHP。你当然应该保留缓存;这将绕过性能问题。

答案 1 :(得分:1)

str_replace不适用于您(除非您希望“superlative”中的“perl”成为关键字),您需要考虑字边界的内容(例如preg_replace with \b)。当然,你不能一次preg_replace所有3000个关键字,但是一个文档几乎不能全部包含它们,因此我建议预先索引所有文档,例如,通过维护索引表doc_id-> word_id。在提供特定文档时,查询索引并仅替换文档实际包含的关键字(可能不超过100)。

另一方面,如果文档很短,维护索引表可能不值得。您可以在运行中简单地进行预索引,例如与strpos

 $kw = array();
 foreach($all_keywords as $k) if(strpos($text, $k)) $kw[] = $k;

 // $kw contains only words that actually occur in the text
 // (and perhaps some more, but that doesn't matter)

 preg_replace_callback('/\b(' . implode('|', $kw) . ')\b/',  'insert_keyword', $text)

答案 2 :(得分:0)

这只是一个加快流程,减少错误等的建议。

  1. 创建一个将批处理新闻档案的功能。
  2. 创建一个替换文本的函数。 str_replace是我的赌注。
  3. 创建一个函数来生成php进程。请参阅此thread
  4. 添加缓存功能。