161

任何人都知道用字符串中的另一个字符串替换最后一次出现的字符串的非常快速的方法吗?

请注意,字符串的最后一次出现可能不是字符串中的最后一个字符。

例子:

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

预期输出:

The Quick Brown Fox Jumps Over A Lazy Dog
4

15 回答 15

249

您可以使用此功能:

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

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

    return $subject;
}
于 2010-10-01T00:00:10.230 回答
31

另一个 1-liner 但没有 preg:

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

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
于 2013-08-07T21:11:44.697 回答
26
$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
于 2012-06-21T19:03:15.160 回答
19

以下相当紧凑的解决方案使用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!!!
于 2015-01-24T16:35:30.570 回答
9

你可以这样做:

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

结果是“你好约翰”;

于 2016-06-01T03:33:25.220 回答
6

这也将起作用:

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);
}
于 2010-10-01T07:43:50.187 回答
6

这是一个古老的问题,但为什么每个人都忽略了最简单的基于正则表达式的解决方案?正常的正则表达式量词是贪婪的,人!如果你想找到一个模式的最后一个实例,只要坚持.*在它前面。就是这样:

$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.
于 2018-12-05T20:47:23.330 回答
3

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

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

$string[$findChar]=".";

echo $string;

输出:picture_0007.value

于 2017-01-23T14:45:19.797 回答
3
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
  $string[$findChar]=".";
}

echo $string;

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

于 2017-03-04T13:26:05.053 回答
2

接受答案的简写

function str_lreplace($search, $replace, $subject){ 
    return is_numeric($pos=strrpos($subject,$search))?
    substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}
于 2018-03-22T07:55:09.887 回答
1

一个简短的版本:

$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
于 2018-12-17T01:46:10.993 回答
0

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

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

我还将使用\K元字符来重置完整字符串匹配,这样就不需要捕获组/反向引用。

代码:(演示

$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
于 2020-11-17T13:19:01.647 回答
0

下面更正了 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 "[]"
于 2021-01-10T07:05:17.353 回答
-1

在 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'
于 2014-08-19T19:05:39.463 回答
-1

对于感兴趣的人:我编写了一个利用 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;
}

基于https://stackoverflow.com/a/3835653/3017716https://stackoverflow.com/a/23343396/3017716

于 2018-05-28T12:30:57.503 回答