str_replace замена только последнего совпадения

dmvlad

Новичок
Никак не могу придумать красивое и простое решение для замены в str_ireplace только последнего совпадения строки.

Код:
$search = "Петя";
$replace = "Вася";
$str = "Наш Петя самых честных правил. Петя.";
str_replace($search, $replace, $str);
Вот тут надо, чтобы не оба Пети поменялись, а только последний.
 

AnrDaemon

Продвинутый новичок
Поделить строку на до и после последнего совпадения, заменить, склеить обратно.
Иначе никак. Если нужно именно str_[I*]replace использовать.
 

dmvlad

Новичок
А что, есть другая функция вместо str_replace более подходящая для замены строки?
 

AnrDaemon

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

WMix

герр M:)ller
Партнер клуба
AnrDaemon,
PHP:
echo preg_replace('~Петя(?!.*Петя)~iu', 'Вася', 'Наш Петя самых честных правил. Петя.');
 

AnrDaemon

Продвинутый новичок
Работать не будет. А, не, будет. Извини. Это я с обратным поиском попутал.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
PHP:
function str_replace_with_limit($search, $replace, $str, $limit) {
    $tokens = explode($search, $str);
    return join($search, array_merge([join($replace, array_slice($tokens, 0, $limit + 1))], array_slice($tokens, $limit + 1)));
}
Отрицательный $limit (или функцию _reverse) оставлю в качестве домашнего задания :)
 

AnrDaemon

Продвинутый новичок
mbstring жутко однобокая библиотека. Я уже на ней наспотыкался :(
 
Сверху