PHP替换字符串中最后一次出现的字符串?

Kir*_*met 139 php string

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

Mis*_*cha 217

你可以使用这个功能:

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

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

    return $subject;
}
Run Code Online (Sandbox Code Playgroud)

  • @Jason 无论如何它都不会返回`TRUE`。无论如何它都会返回一个字符串。如果无法进行替换,则返回原始的 `$subject`,就像 [`substr_replace `](http://php.net/manual/en/function.substr-replace.php) 和 [`str_replace` ](http://php.net/manual/en/function.str-replace.php) 做。 (4认同)
  • 这怎么工作?`strpos - 查找字符串中子字符串第一次出现的位置` - 编辑:哇。Php天才真的做了一个叫做`strpos`和`strrpos`的函数吗?谢谢.... (2认同)

ric*_*cka 29

另一个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
Run Code Online (Sandbox Code Playgroud)

  • 看到有人对preg进行基准测试会很有趣 (14认同)
  • FWIW,公认的解决方案比此解决方案快约35%. (3认同)

小智 25

$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
Run Code Online (Sandbox Code Playgroud)


Joh*_*son 10

下面相当紧凑的解决方案使用PCRE正向前瞻断言来匹配感兴趣的子字符串的最后一次出现,即子字符串的出现,后面没有任何其他出现的相同子字符串.因此,该示例替换了last 'fox'with 'dog'.

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

OUTPUT: 

The quick brown fox, fox, fox jumps over the lazy dog!!!
Run Code Online (Sandbox Code Playgroud)

  • 这个想法很好,但代码不是.它必须是:`$ string ='快速的棕色狐狸,狐狸,狐狸跳过懒狐狸!'; echo preg_replace('/(fox(?!.*fox))/','dog',$ string);` (5认同)

小智 8

你可以这样做:

$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Run Code Online (Sandbox Code Playgroud)

结果是'你好约翰';

问候

  • 只要没有重复的字符,这就可以工作.在我的情况下,我正在从存档日期中删除页码,所以我有"2015-12/2",它将全部/全部2个结束变为"2015-1". (4认同)
  • 我不建议任何人使用这个(无法解释的)代码,它很容易悄悄失败。这个答案不会尝试“查找”字符串的最后一次出现 - 它只是在满足字符掩码的情况下不断消耗输入字符串右侧的字符。这做同样的事情:`rtrim($str, 'dlorw')` (4认同)

Ali*_*xel 6

这也将起作用:

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

更新稍微简洁的版本(http://ideone.com/B8i4o):

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


Fra*_*ank 5

只需一行代码(迟来的答案,但值得添加):

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

preg_replace('/'. $find_me .'$/', '', $string);
Run Code Online (Sandbox Code Playgroud)

结尾的$表示字符串的结尾。


ale*_*xis 5

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

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

这会将“fox”的最后一个实例替换为“DUCK”,就像它应该的那样,并打印:

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