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

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

12 ответов


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

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

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

    return $subject;
}

еще один 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

$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

вы могли бы сделать это:

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

результат "Привет Джон";

в отношении


довольно компактное решение использует PCRE положительное утверждение 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!!!

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

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

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

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

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

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

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

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


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

echo $string;

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


вы можете использовать strrpos (), чтобы найти последнего матча.

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

$string[$findChar]=".";

echo $string;

выход : picture_0007.значение


используйте " $ " в выражении 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'

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

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

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

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;
}

на основе https://stackoverflow.com/a/3835653/3017716 и https://stackoverflow.com/a/23343396/3017716