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

时间:2010-09-30 23:55:07

标签: php string

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

16 个答案:

答案 0 :(得分:210)

您可以使用此功能:

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

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

    return $subject;
}

答案 1 :(得分:28)

另一个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

答案 2 :(得分:24)

$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

答案 3 :(得分:8)

以下相当紧凑的解决方案使用PCRE positive lookahead assertion来匹配感兴趣的子字符串的最后一个匹配项,即子字符串的出现,后面没有任何其他出现的相同子字符串。因此,该示例将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!!!

答案 4 :(得分:6)

你可以这样做:

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

结果是' Hello John';

此致

答案 5 :(得分:5)

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

$result = empty($_POST['result']) ? array() : $_POST['result'];

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

答案 6 :(得分:4)

这也有效:

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

答案 7 :(得分:2)

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

echo $string;

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

答案 8 :(得分:1)

您可以使用strrpos()查找最后一场比赛。

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

$string[$findChar]=".";

echo $string;

输出:picture_0007.value

答案 9 :(得分:1)

接受回答的简写

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

答案 10 :(得分:1)

这是一个古老的问题,但是为什么每个人都忽略了最简单的基于正则表达式的解决方案?普通的正则表达式量词是贪婪的,人们!如果要查找模式的最后一个实例,只需将.*放在其前面。方法如下:

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

这会将“ fox”的 last 实例替换为“ DUCK”,如预期的那样,并打印:

The quick brown fox, fox, fox, DUCK, jumps over etc.

答案 11 :(得分:0)

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

答案 12 :(得分:0)

感兴趣的是:我已经编写了一个使用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

答案 13 :(得分:0)

简短版本:

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

答案 14 :(得分:0)

尽管使用正则表达式通常比非正则表达式技术性能差,但我确实感谢它提供的控制性和灵活性。

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

我还将使用\K元字符来重置全字符串匹配,以便不需要捕获组/反向引用。

代码:(Demo

$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

没有单词边界:(Demo

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

答案 15 :(得分: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 "[]"