PHP заменяет случайное слово строки

Я хочу заменить одно случайное слово, из которого несколько строк.

Итак, скажем, строка

$str = 'I like blue, blue is my favorite colour because blue is very nice and blue is pretty'; 

И, допустим, я хочу заменить слово «синий» красным, но только 2 раза в случайных положениях.

Поэтому после выполнения функции выход может быть похож на

 I like red, blue is my favorite colour because red is very nice and blue is pretty 

Другой может быть

 I like blue, red is my favorite colour because blue is very nice and red is pretty 

Поэтому я хочу заменить одно и то же слово несколько раз, но каждый раз на разных позициях.

Я думал об использовании preg_match, но у него нет возможности, чтобы положение слова peing было случайным.

Кто-нибудь знает, как это достичь?

Поскольку я ненавижу использовать регулярное выражение для чего-то, что на array_rand() взгляд очень просто, чтобы гарантировать ровно n замещений, я думаю, что это может помочь здесь, поскольку это позволяет использовать легко использовать array_rand() , что делает именно то, что вы want – выберите n случайных элементов из списка неопределенной длины ( УЛУЧШЕНО ).

 <?php function replace_n_occurences ($str, $search, $replace, $n) { // Get all occurences of $search and their offsets within the string $count = preg_match_all('/\b'.preg_quote($search, '/').'\b/', $str, $matches, PREG_OFFSET_CAPTURE); // Get string length information so we can account for replacement strings that are of a different length to the search string $searchLen = strlen($search); $diff = strlen($replace) - $searchLen; $offset = 0; // Loop $n random matches and replace them, if $n < 1 || $n > $count, replace all matches $toReplace = ($n < 1 || $n > $count) ? array_keys($matches[0]) : (array) array_rand($matches[0], $n); foreach ($toReplace as $match) { $str = substr($str, 0, $matches[0][$match][1] + $offset).$replace.substr($str, $matches[0][$match][1] + $searchLen + $offset); $offset += $diff; } return $str; } $str = 'I like blue, blue is my favorite colour because blue is very nice and blue is pretty'; $search = 'blue'; $replace = 'red'; $replaceCount = 2; echo replace_n_occurences($str, $search, $replace, $replaceCount); 

Посмотрите, как работает

 echo preg_replace_callback('/blue/', function($match) { return rand(0,100) > 50 ? $match[0] : 'red'; }, $str); 

Ну, вы можете использовать этот алгоритм:

  1. рассчитать случайное количество раз, когда вы хотите заменить строку
  2. взорвать строку в массив
  3. для этого массива замените появление строки только в том случае, если случайное значение между 1 и 100 составляет% 3 (для istance)
  4. Уменьшите количество, рассчитанное в точке 1.
  5. Повторяйте, пока число не достигнет 0.
 <?php $amount_to_replace = 2; $word_to_replace = 'blue'; $new_word = 'red'; $str = 'I like blue, blue is my favorite colour because blue is very nice and blue is pretty'; $words = explode(' ', $str); //convert string to array of words $blue_keys = array_keys($words, $word_to_replace); //get index of all $word_to_replace if(count($blue_keys) <= $amount_to_replace) { //if there are less to replace, we don't need to randomly choose. just replace them all $keys_to_replace = array_keys($blue_keys); } else { $keys_to_replace = array(); while(count($keys_to_replace) < $amount_to_replace) { //while we have more to choose $replacement_key = rand(0, count($blue_keys) -1); if(in_array($replacement_key, $keys_to_replace)) continue; //we have already chosen to replace this word, don't add it again else { $keys_to_replace[] = $replacement_key; } } } foreach($keys_to_replace as $replacement_key) { $words[$blue_keys[$replacement_key]] = $new_word; } $new_str = implode(' ', $words); //convert array of words back into string echo $new_str."\n"; ?> 

NB Я просто понял, что это не заменит первый синий цвет, поскольку он вводится в массив слов как «синий» и поэтому не совпадает с вызовом array_keys.