Как использовать str_replace () для удаления текста определенное количество раз только в PHP?

Я пытаюсь удалить слово «Джон» определенное количество раз из строки. Я прочитал в руководстве php, что str_replace исключает 4-й параметр, называемый «count». Поэтому я решил, что можно использовать, чтобы указать, сколько экземпляров поиска нужно удалить. Но, похоже, это не так, поскольку следующее:

$string = 'Hello John, how are you John. John are you happy with your life John?'; $numberOfInstances = 2; echo str_replace('John', 'dude', $string, $numberOfInstances); 

заменяет все экземпляры слова «Джон» на «чувак» вместо того, чтобы делать это всего два раза и оставлять двух других Джона в одиночку.

Для моих целей не имеет значения, в каком порядке происходит замещение, например, могут быть заменены первые 2 экземпляра, или последние две или комбинация, порядок замены не имеет значения.

Итак, есть способ использовать str_replace () таким образом или есть еще одна встроенная функция (не-regex), которая может достичь того, что я ищу?

Как объясняет Артелиус, последний параметр str_replace() задается функцией. Нет параметра, который позволяет вам ограничить количество замен.

Только preg_replace() имеет такой параметр:

 echo preg_replace('/John/', 'dude', $string, $numberOfInstances); 

Это так же просто, как и получается, и я предлагаю использовать его, потому что его производительность слишком мала по сравнению с скукой следующего нерепрессивного решения:

 $len = strlen('John'); while ($numberOfInstances-- > 0 && ($pos = strpos($string, 'John')) !== false) $string = substr_replace($string, 'dude', $pos, $len); echo $string; 

Вы можете выбрать любое решение, хотя оба работают так, как вы планируете.

Вы неправильно поняли формулировку руководства.

Если это будет принято, будет установлено количество выполненных замен.

Параметр передается по ссылке и его значение изменяется функцией, чтобы указать, сколько раз строка была найдена и заменена. Его начальное значение отбрасывается.

Есть несколько вещей, которые вы могли бы сделать для достижения этого, но я не могу придумать одну конкретную функцию php, которая легко позволит вам это сделать.

Один из вариантов – создать собственную функцию замены и использовать strripos и substr для замены.

Еще одна вещь, которую вы можете сделать, это использовать preg_replace_callback и подсчитать количество замен, которое вы сделали в обратном вызове.

Вероятно, есть больше способов, но это все, о чем я могу думать «на лету». Если производительность является проблемой, я предлагаю вам попробовать и попробовать некоторые простые тесты.

Артелиус уже описал, как работает эта функция, просто покажу вам, как это сделать с помощью ручных методов:

 function str_replace_occurrences($find,$replace,$string,$count = 0) { if($count == 0) { return str_replace($find,$replace,$string); } $pos = 0; $len = strlen($find); while($pos < $count && false !== ($pos = strpos($string,$find,$pos))) { $string = substr_replace($string,$replace,$pos,$len); } return $string; } 

Это непроверено, но должно работать.