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



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

575   12  

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

результат 'Hello 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

Comments

    Ничего не найдено.