Да, есть. Используйте preg_replace_callback()
:
<?php
header('Content-Type: text/plain');
$text = 'word1 some more words. word2 and some more words';
$text = preg_replace_callback('!\w+!', 'filter_bad_words', $text);
echo $text;
$bad_words = array(
'word1' => 'gosh',
'word2' => 'darn',
);
function filter_bad_words($matches) {
global $bad_words;
$replace = $bad_words[$matches[0]];
return isset($replace) ? $replace : $matches[0];
}
?>
Это простой фильтр, но он имеет много ограничений. Как будто это не остановит различия в написании, использовании пробелов или других несловарных символов между буквами, замене букв цифрами и так далее. Но насколько вы изощренны, это зависит от вас.
ОБНОВЛЕНИЕ (9/11/2016)
Я понимаю, что это 7 лет, но новые версии php, похоже, выдают исключение, если проверяемое слово отсутствует в массиве $bad_words
. Чтобы исправить это, я изменил последние две строки filter_bad_words()
следующим образом:
$replace = array_key_exists($matches[0], $bad_words) ? $bad_words[$matches[0]] : false;
return $replace ?: $matches[0];