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)