Quelqu'un connaît-il un moyen très rapide de remplacer la dernière occurrence d'une chaîne par une autre chaîne dans une chaîne?
Vous pouvez utiliser cette fonction:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
Un autre 1-liner mais sans 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
La solution plutôt compacte suivante utilise l’association assertion de vérification anticipée positive PCRE pour faire correspondre la dernière occurrence de la sous-chaîne d’intérêt, c’est-à-dire une occurrence de la sous-chaîne non suivie d’autres occurrences de la même sous-chaîne. Ainsi, l'exemple remplace le last 'fox'
avec 'dog'
.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
SORTIE:
The quick brown fox, fox, fox jumps over the lazy dog!!!
Vous pourriez faire ceci:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Le résultat est 'Hello John';
Cordialement
Juste une ligne de code (réponse tardive mais ça vaut la peine de l'ajouter):
$string = 'The quick brown fox jumps over the lazy dog';
$find_me = 'dog';
preg_replace('/'. $find_me .'$/', '', $string);
la fin $ indique la fin de la chaîne.
Cela fonctionnera également:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
[~ # ~] update [~ # ~] Version légèrement plus concise ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
C'est une question ancienne, mais pourquoi tout le monde oublie-t-il la solution la plus simple basée sur les expressions rationnelles? Les quantificateurs d'expressions rationnelles normaux sont gourmands, les gens! Si vous voulez trouver la dernière instance d'un motif, collez simplement .*
devant lui. Voici comment:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Ceci remplacera l'instance last de "fox" en "DUCK", comme c'est supposé le faire, et affichera:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Outre les erreurs dans le code, Faruk Unal a la meilleure réponse. Une fonction fait l'affaire.
Vous pouvez utiliser strrpos () pour trouver la dernière correspondance.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Sortie: picture_0007.value
Sténographie pour réponse acceptée
function str_lreplace($search, $replace, $subject){
return is_numeric($pos=strrpos($subject,$search))?
substr_replace($subject,$replace,$pos,strlen($search)):$subject;
}
Utilisez le "$" sur une expression reg pour correspondre à la fin de la chaîne
$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'
Pour les intéressés: j'ai écrit une fonction qui utilise preg_match afin que vous puissiez remplacer du côté droit en utilisant regex.
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;
}
Ou comme combinaison/mise en œuvre abrégée des deux options:
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;
}
basé sur https://stackoverflow.com/a/3835653/3017716 et https://stackoverflow.com/a/23343396/3017716
Une version courte:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));