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