Подтвердить что ты не робот

PHP Замените последнее вхождение строки в строку?

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

4b9b3361

Ответ 1

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

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

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

    return $subject;
}

Ответ 2

Другой 1-лайнер, но без preg:

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

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer

Ответ 3

$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

Ответ 4

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

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

Результат: "Hello John";

Привет

Ответ 5

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

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

ВЫХОД:

The quick brown fox, fox, fox jumps over the lazy dog!!!

Ответ 6

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

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

UPDATE Немного более сжатая версия (http://ideone.com/B8i4o):

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

Ответ 7

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

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

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

конец $указывает конец строки.

Ответ 8

$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

Помимо ошибок в коде, у Faruk Unal есть лучший anwser. Одна функция выполняет трюк.

Ответ 9

Вы можете использовать strrpos() для поиска последнего совпадения.

$string = "picture_0007_value";
$findChar =strrpos($string,"_");

$string[$findChar]=".";

echo $string;

Выход: picture_0007.value

Ответ 10

Используйте "$" в выражении reg для соответствия концу строки

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

//output
'The quick brown fox jumps over the lazy dog'

Ответ 11

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

function str_lreplace($search, $replace, $subject){ 
    return is_numeric($pos=strrpos($subject,$search))?
    substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}

Ответ 12

Для заинтересованных: я написал функцию, которая использует preg_match, чтобы вы могли заменить правую часть с помощью регулярного выражения.

function preg_rreplace($search, $replace, $subject) {
    preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
    $lastMatch = end($matches);

    if ($lastMatch && false !== $pos = strrpos($subject, $lastMatchedStr = $lastMatch[0])) {
        $subject = substr_replace($subject, $replace, $pos, strlen($lastMatchedStr));
    }

    return $subject;
}

Или как сокращенная комбинация/реализация обоих вариантов:

function str_rreplace($search, $replace, $subject) {
    return (false !== $pos = strrpos($subject, $search)) ?
        substr_replace($subject, $replace, $pos, strlen($search)) : $subject;
}
function preg_rreplace($search, $replace, $subject) {
    preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
    return ($lastMatch = end($matches)) ? str_rreplace($lastMatch[0], $replace, $subject) : $subject;
}

на основе fooobar.com/questions/51520/... и fooobar.com/questions/813039/...

Ответ 13

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

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

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

The quick brown fox, fox, fox, DUCK, jumps over etc.