我有一個新聞網站,其中包含一個包含超過100萬條新聞的檔案。 我創建了一個包含約3000個條目的單詞定義數據庫,由單詞定義對組成。用php和mysql替換文本中的關鍵字
我想要做的是在新聞中添加一個定義旁邊的每個這些單詞的發生。 我不能做一個靜態更改,因爲我可以每天添加一個新的關鍵字,所以我可以實時或緩存。
問題是,str_replace
或preg_replace
在搜索文本中的3千個關鍵字並替換它們時會很慢。
有沒有快速的選擇?
我有一個新聞網站,其中包含一個包含超過100萬條新聞的檔案。 我創建了一個包含約3000個條目的單詞定義數據庫,由單詞定義對組成。用php和mysql替換文本中的關鍵字
我想要做的是在新聞中添加一個定義旁邊的每個這些單詞的發生。 我不能做一個靜態更改,因爲我可以每天添加一個新的關鍵字,所以我可以實時或緩存。
問題是,str_replace
或preg_replace
在搜索文本中的3千個關鍵字並替換它們時會很慢。
有沒有快速的選擇?
str_replace函數不會爲你工作(除非你想在「最高級」,「perl的」是一個關鍵詞),你需要的東西,需要字邊界考慮(例如帶的preg_replace \b
)。當然,你不能一次預置所有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)
str_replace很漂亮,就我所知,它是你找到的最快的PHP。你當然應該保持一個緩存;這將繞過性能問題。
這只是一個建議,以加快這一進程,減少失誤等
我同意。如果您有一組定義的單詞,沒有理由使用preg_replace。 – kingjeffrey 2010-04-14 09:44:20