Php 替换字符串中最后出现的字符串

Php 替换字符串中最后出现的字符串,php,string,replace,last-occurrence,Php,String,Replace,Last Occurrence,有人知道用字符串中的另一个字符串替换最后一个字符串的非常快速的方法吗 注意,字符串的最后一次出现可能不是字符串中的最后一个字符。 例如: $search = 'The'; $replace = 'A'; $subject = 'The Quick Brown Fox Jumps Over The Lazy Dog'; 预期产出: The Quick Brown Fox Jumps Over A Lazy Dog 您可以使用此功能: function str_lreplace($search,

有人知道用字符串中的另一个字符串替换最后一个字符串的非常快速的方法吗

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

例如:

$search = 'The';
$replace = 'A';
$subject = 'The Quick Brown Fox Jumps Over The Lazy Dog';
预期产出:

The Quick Brown Fox Jumps Over A Lazy Dog

您可以使用此功能:

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);
}
更新更简洁的版本():


另一个不带preg的1-liner:

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

以下相当紧凑的解决方案使用匹配感兴趣的子字符串的最后一次出现,也就是说,子字符串的一次出现之后没有相同子字符串的任何其他出现。因此,该示例将
最后一个'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;

除了代码中的错误之外,法鲁克·乌纳尔拥有最好的anwser。一个函数就可以做到这一点。

可接受答案的简写

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

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

基于和这是一个古老的问题,但是为什么每个人都忽略了最简单的基于regexp的解决方案呢?普通的正则表达式量词是贪婪的,人们!如果您想找到某个模式的最后一个实例,只需将
*
粘贴在其前面即可。以下是方法:

$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
这将像预期的那样,将“fox”的最后一个实例替换为“DUCK”,并打印:

敏捷的棕色狐狸、狐狸、狐狸、鸭子、跳跃等等。
简短版本:

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

虽然使用正则表达式的性能通常比不使用正则表达式的技术要差,但我非常欣赏它提供的控制和灵活性

在我的代码片段中,我将模式设置为不区分大小写(
\I
,尽管我的示例输入不会挑战此规则),并包括单词边界(
\b
,尽管没有显式调用)

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

代码:()

输出:

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

没有单词边界:()

输出:

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

下面更正了zack的代码()。 小心使用正则表达式!考虑这一点:

$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 "[]"


我做错了吗?如果是这样,请忽略我:)|| echo str|u lreplace(“x”、“y”、“这个x或那个x”);=>输出:“y”见:@edorian:Oops!抱歉,我在匆忙中发布了此消息,正确的版本如下:。此答案缺少教育性解释。无论发生什么情况,此消息仍返回为真。考虑修改它是:如果($POS){$Basic=SubjRead($PATH,$PASS,$POS,STRLLN($Search));返回$主体;}{返回false;}杰森不返回<代码>真< /代码>,不管怎样。不管发生什么,它都返回一个字符串。如果无法进行替换,它将返回原始的
$subject
,就像and do一样。@Misha在这种情况下不是这样吗?我试图做一些类似的事情!str_lreplace,但如果它不返回false,就被认为是true,对吗?不管怎样,这都帮了我的忙,我很感激。谢谢,这怎么行<代码>strpos-查找字符串中第一个出现的子字符串的位置-编辑:哇。Php天才们真正实现了一个名为
strpos
strrpos
的函数?谢谢……@Barry这是一个PHP不应该受到指责的例子:-)这些名称是基于标准C库中已有几十年历史的strstr,它们都是相同的函数。(但他们是否必须更改名称?)只有在最后一次出现在字符串末尾时才有效。如果在最后一个“fox”之后出现任何其他字符,则不起作用。只要没有任何重复的字符,此操作就有效。在我的情况下,我将页码从存档日期中剥离出来,因此我有“2015-12/2”,并将所有/和所有2从结尾变成“2015-1”。这只在搜索的最后一个事件是最后一个单词并且之后没有其他字符时才起作用。这不起作用,因为没有按照您的想法进行操作。它将从搜索字符串的末尾以任何顺序删除所有存在的字符(并始终附加替换字符),例如“Hello word”->“Hello John”,“Hello lord”->“Hello John”,“Hello motor”->“Hello motJohn”,“Hello worldy”->“Hello worldyJohn”。我不建议任何人使用此选项(无法解释)容易悄然失败的代码。这个答案并不试图“查找”字符串的最后一个匹配项——它只是在满足字符掩码的情况下使用输入字符串右侧的字符。这与此相同:
rtrim($str,'dlorw')
您可能会发现有帮助,如中所示。您需要检查$findChar是否为false(与接受的答案相同)。如果字符串不包含搜索的字符串,您会得到通知,第一个字符将被替换。这很好,但目前它只能将1个字符替换为1个字符。上述注释是正确的。这仅在替换长度为1.FWIW的单字节字符串时才正确。接受的解决方案比此解决方案快大约35%。我总是选择一个正则表达式函数,而不是6个函数调用。我无法想象在专业代码中使用这种技术。为什么所有字符串都是反向的?使用正则表达式时是否有(我假设)特定的性能增益?不,它实际上会降低性能,但这是因为您只希望最后一次出现,所以您将搜索限制为一次,如果您希望第一次出现,则可以反转所有内容,而不必反转任何内容!完满赋
  The Quick Brown Fox Jumps Over The Lazy Dog's Armos!
# ^^^                            ^^^            ^
# not replaced              not replaced        replaced
$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 "[]"