вы можете использовать preg_replace_callback
:
$random_string = '…';
$needle = array('pretty', 'beautiful', 'gorgeous', 'lovely', 'attractive', 'appealing');
$new_string = preg_replace_callback(
array_map(
function($v) { return '/'.preg_quote($v).'/'; }, // assuming $needle does not contain '/'
$needle),
function($matches) use($needle) {
do {
$new = $needle[rand(0, count($needle)-1)];
while($new != $matches[0]) {
return $new;
},
$random_string);
чтобы убедиться, что ваш массив $needle
не содержит символов, которые имеют специальное значение в регулярном выражении, мы вызываем preg_quote
для каждого элемента массива перед поиском.
вместо выполнения цикла do{}while()
вы также можете скопировать массив и удалить совпавшее слово (в значительной степени зависит от фактических данных: несколько элементов → копировать и удалить, много элементов → выбрать один случайный случай, пока он не будет отличаться от соответствия)