Следующее является просто альтернативой.Он может или не может удовлетворить ваши требования.
Он выполняет 84 операции в секунду со словарем 10k слов и строкой 15k на моем ноутбуке.
Недостатком является то, что он не удаляет пробелы вокруг слов.
$ wordlist - это просто строки по одному слову в каждой, это может быть файл.
$dict = array_flip(preg_split('/\n/',$wordlist));
function filter($str,$dict) {
$words = preg_split('/\s/',$str);
sort($words);
$words = array_unique($words);
foreach ($words as $word) {
if (key_exists($word,$dict)) {
$removeWords[] = '/\b' . $word . '\b/';
}
}
return preg_replace($removeWords, '', $str);
}
Еще один пример, который работает немного быстрее (107op / s со строкой 15kb и словарем 10k слов)
function filter2($str,$dict) {
$words = preg_split('/\b/',$str);
foreach ($words as $k => $word) {
if (key_exists($word,$dict)) {
unset($words[$k]);
}
}
return implode('', $words);
}