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 ライナーですが、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 に答える
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 に答える
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 に答える
0

以下の修正されたザックのコード ( 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 に答える