Как использовать str_replace () для удаления текста определенное количество раз только в PHP? - PullRequest
4 голосов
/ 16 января 2011

Я пытаюсь удалить слово «Джон» определенное количество раз из строки. Я прочитал в руководстве по 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) функция, которая может достичь того, что я ищу?

Ответы [ 5 ]

5 голосов
/ 16 января 2011

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

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

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

4 голосов
/ 16 января 2011

Как объясняет Артелиус, последний параметр 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;

Однако вы можете выбрать любое решение, оба работают так, как вам нужно.

1 голос
/ 16 января 2011

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

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

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

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

0 голосов
/ 08 марта 2018
function str_replace_occurrences($find, $replace, $string, $count = -1) {
    // current occrurence 
    $current = 0;
    // while any occurrence 
    while (($pos = strpos($string, $find)) != false) {
        // update length of str (size of string is changing)
        $len = strlen($find);
        // found next one 
        $current++;
        // check if we've reached our target 
        // -1 is used to replace all occurrence 
        if($current <= $count || $count == -1) {
            // do replacement 
            $string = substr_replace($string, $replace, $pos, $len);
        } else {
            // we've reached our 
            break;
        }
    }
    return $string;
}
0 голосов
/ 16 января 2011

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

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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...