回答:
この関数を使用できます。
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
。何があっても文字列を返します。交換ができない場合は、元のを返す$subject
だけのようにsubstr_replace
してstr_replace
ください。
strpos — Find the position of the first occurrence of a substring in a string
-編集:すごい。PHPの天才は本当にと呼ばれる関数作られたstrpos
とはstrrpos
?ありがとう....
別の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
$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
次のかなりコンパクトなソリューションは、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!!!
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
あなたはこれを行うことができます:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
結果は「ハロージョン」です。
よろしく
これも機能します:
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);
}
これは古代の質問ですが、なぜ誰もが最も単純な正規表現ベースのソリューションを見落としているのですか?通常の正規表現の数量詞は貪欲です、人々!パターンの最後のインスタンスを見つけたい場合は、その.*
前にくっついてください。方法は次のとおりです。
$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.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
コードの誤りは別として、Faruk Unalは最高のアンサーを持っています。1つの関数がトリックを行います。
短いバージョン:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
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'
興味のある方:regexを使用して右側から置換できるように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/3017716およびhttps://stackoverflow.com/a/23343396/3017716に基づく
s($str)->replaceLast($search, $replace)
にあるように、役立つ場合があります。