PHP заменить последнее вхождение строки в строке? - PullRequest
135 голосов
/ 01 октября 2010

Кто-нибудь знает очень быстрый способ замены последнего вхождения строки другой строкой в ​​строке?

Ответы [ 14 ]

211 голосов
/ 01 октября 2010

Вы можете использовать эту функцию:

function str_lreplace($search, $replace, $subject)
{
    $pos = strrpos($subject, $search);

    if($pos !== false)
    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }

    return $subject;
}
28 голосов
/ 08 августа 2013

Еще 1 вкладыш, но без прега:

$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
24 голосов
/ 21 июня 2012
$string = 'this is my world, not my world';
$find = 'world';
$replace = 'farm';
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
echo strrev($result); //output: this is my world, not my farm
8 голосов
/ 24 января 2015

Следующее довольно компактное решение использует PCRE положительное предпросмотровое утверждение для соответствия последнему вхождению подстроки, представляющей интерес, то есть вхождению подстроки, за которым не следуют другие вхождения того жеподстрока.Таким образом, пример заменяет last 'fox' на 'dog'.

$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);

OUTPUT:

The quick brown fox, fox, fox jumps over the lazy dog!!!
6 голосов
/ 01 июня 2016

Вы можете сделать это:

$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';

Результат «Привет, Джон»;

Привет

5 голосов
/ 12 марта 2016

Всего одна строка кода (поздний ответ, но его стоит добавить):

$string = 'The quick brown fox jumps over the lazy dog';
$find_me = 'dog';

preg_replace('/'. $find_me .'$/', '', $string);

окончание $ обозначает конец строки.

4 голосов
/ 01 октября 2010

Это также будет работать:

function str_lreplace($search, $replace, $subject)
{
    return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}

ОБНОВЛЕНИЕ Чуть более лаконичная версия (http://ideone.com/B8i4o):

function str_lreplace($search, $replace, $subject)
{
    return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
2 голосов
/ 04 марта 2017
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

Помимо ошибок в коде, Фарук Унал имеет лучший ответ. Одна функция делает свое дело.

1 голос
/ 05 декабря 2018

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

$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);

Это заменит последний экземпляр "fox" на "DUCK", как и положено, и напечатает:

The quick brown fox, fox, fox, DUCK, jumps over etc.
1 голос
/ 22 марта 2018

Сокращение для принятого ответа

function str_lreplace($search, $replace, $subject){ 
    return is_numeric($pos=strrpos($subject,$search))?
    substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...