替换字符串中字符串的最后一个匹配项

有没有人知道一种非常快速的方法,可以用字符串中的另一个字符串替换字符串的最后一个匹配项?

注意,字符串的最后一个匹配项可能不是字符串中的最后一个字符。

例如:

$search = 'The';
$replace = 'A';
$subject = 'The Quick Brown Fox Jumps Over The Lazy Dog';

预期产出:

The Quick Brown Fox Jumps Over A Lazy Dog
126077 次浏览

你可以使用这个函数:

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


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


return $subject;
}

这也会奏效:

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

另一种没有预处理的1-班轮手机:

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


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

使用 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'

下面这个相当紧凑的解决方案使用 PCRE 正向前瞻断言来匹配感兴趣的子字符串的最后一个匹配项,也就是说,子字符串的匹配项后面没有相同子字符串的任何其他匹配项。因此,该示例将 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!!!

你可以这样做:

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

结果是“你好,约翰”;

可以使用 strrpos ()查找最后一个匹配项。

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


$string[$findChar]=".";


echo $string;

输出: picture _ 0007. value

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


echo $string;

除了代码中的错误,Faruk Unal 有最好的答案,一个函数就可以解决问题。

公认答案的简写

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/3017716https://stackoverflow.com/a/23343396/3017716

这是一个古老的问题,但是为什么每个人都忽略了最简单的基于 regexp 的解决方案呢?正常的 regexp 量词是贪婪的,人们!如果您想找到模式的最后一个实例,只需将 .*放在它的前面。方法如下:

$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.

简而言之:

$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));

虽然使用正则表达式的性能通常不如非正则表达式技术,但我确实欣赏它所提供的控制和灵活性。

在我的代码片段中,我将把模式设置为不区分大小写(\i,尽管我的示例输入不会挑战这个规则) ,并包含单词边界(\b,尽管它们没有被明确调用)。

我还将使用 \K元字符重置 fullstring 匹配,这样就不需要捕获组/回引用了。

密码: (演示)

$search = 'The';
$replace = 'A';
$subject = "The Quick Brown Fox Jumps Over The Lazy Dog's Thermos!";


echo preg_replace(
'/.*\K\b' . preg_quote($search, '/') . '\b/i',
$replace,
$subject
);

产出:

  The Quick Brown Fox Jumps Over A Lazy Dog's Thermos!
# ^^^                            ^            ^^^
# not replaced                replaced        not replaced

无单词界限: (演示)

echo preg_replace(
'/.*\K' . preg_quote($search, '/') . '/i',
$replace,
$subject
);

产出:

  The Quick Brown Fox Jumps Over The Lazy Dog's Armos!
# ^^^                            ^^^            ^
# not replaced              not replaced        replaced

下面更正了 Zack 的代码(https://stackoverflow.com/a/11144999/9996503)。 小心使用正则表达式:

$string = 'Round brackets (parentheses) "()", square brackets "()"';
$find = '()';
$replace = '[]';
// Zack's code:
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
var_dump($result); // Output: NULL
// Correct code:
$result = strrev(preg_replace('/'.preg_quote(strrev($find)).'/', strrev($replace), strrev($string), 1));
echo $result; //Output: Round brackets (parentheses) "()", square brackets "[]"