str_replace は機能しません ("最上級" の "perl" をキーワードにしたい場合を除く)。単語の境界を考慮した何かが必要です (例: preg_replace with \b
)。もちろん、一度に 3000 個のキーワードすべてを preg_replace することはできませんが、1 つのドキュメントにそれらすべてを含めることはほとんどできません。したがって、たとえば、インデックス テーブル 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)