Это архив блога mr.The Блог больше не обновляется. статьи сохранены в ознакомительных целях.

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

2011-01-08

Давно я не писал про 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, что бы на выходе была строка, а не массив.