Бложек теперь на old.mrThe.name. Следите за обновлениями.

Давно я не писал про php.

.

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

.

Тут же была найдена функция preg_replace поддерживающая нужную функциональность, но она дико тормозила, выедала кучу памяти, короче – не подходила.

.

Немного погуглив я вернулся к документации и в комментариях обнуружил нужный мне велосипед:

<?php
function getSingleReplaceCombinations($replace, $with, $inHaystack)
{
    $splits = explode($replace, $inHaystack);
    $result = array();
    for ($i = 1, $ix = count($splits); $i < $ix; ++$i) {
        $previous = array_slice($splits, 0, $i);
        $next     = array_slice($splits, $i);
 
        $combine  = array_pop($previous) . $with . array_shift($next);
        $result[] = implode($replace, array_merge($previous, array($combine), $next));
    }
    return $result;
}
var_dump(getSingleReplaceCombinations("a", "x", "aba")); // result as mentioned above
?>

На выходе функция отдаёт массив со всеми возможными заменами.
Но, мне ведь нужна только одна замена, это решилось добавлением break в конце цикла:

function getSingleReplaceCombination($replace, $with, $inHaystack) {
    $splits = explode($replace, $inHaystack);
    $result = array();
    for ($i = 1, $ix = count($splits); $i < $ix; ++$i) {
        $previous = array_slice($splits, 0, $i);
        $next     = array_slice($splits, $i);
 
        $combine  = array_pop($previous) . $with . array_shift($next);
        $result[] = implode($replace, array_merge($previous, array($combine), $next));
        break; //remove this, for multiple replaces
    }
    return implode("",$result);
}

Так же, я завернул return в implode, что бы на выходе была строка, а не массив.

Похожие записи:

2 комментария к “Ограничение количества замен str_replace”

  1. Vlad&slav Пишет:

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
    какбы count
    Если передан, то будет установлен в количество произведенных замен.
    не понял смысла писать функцию))

    mr.The: там же апмерсанд стоит! Мы, передав туда переменную, узнаем сколько замен было сделано, а не укажем сколько делать.

    темболее можно гораздо короче
    explode() => $arr[2] = “замена 3″; => implode()

    mr.The: хм, как вариант.

  2. Vlad&slav Пишет:

    а точно, на & не посмотрел

Оставить комменатрий: