Я пытаюсь удалить слово «Джон» определенное количество раз из строки. Я прочитал в руководстве 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; }
Это непроверено, но должно работать.