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?
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?
Réponses:
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;
}
TRUEpas quoi qu'il arrive . Il renvoie une chaîne quoi qu'il arrive. Si un remplacement ne peut pas être effectué, il renvoie l'original $subject, tout comme substr_replace et str_replacefaire.
strpos — Find the position of the first occurrence of a substring in a string- modifier: wow. Les génies de Php ont vraiment créé une fonction appelée strposet strrpos? Merci ....
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' assertion d'anticipation 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 qui n'est suivie par aucune autre occurrence de la même sous-chaîne. Ainsi, l'exemple remplace le last 'fox'par 'dog'.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
PRODUCTION:
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);
Vous pouvez faire ceci:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Le résultat est «Hello John»;
Cordialement
rtrimne se comporte pas comme vous le pensez. Il supprimera de la fin tous les caractères qui existent dans la chaîne de recherche dans n'importe quel ordre (et ajoutera toujours le remplacement), par exemple "Hello word" -> "Hello John", "Hello Lord" -> "Hello John", "Hello motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".
Cela fonctionnera également:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
MISE À JOUR 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 néglige-t-il la solution la plus simple basée sur les expressions rationnelles? Les quantificateurs de regexp normaux sont gourmands, les gens! Si vous voulez trouver la dernière instance d'un motif, tenez-vous juste .*devant. Voici comment:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Cela remplacera la dernière instance de "renard" par "DUCK", comme il est censé le faire, et imprimera:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Hormis les erreurs de 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
Une version courte:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
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 par le 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 en tant que combinaison / implémentation 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
s($str)->replaceLast($search, $replace)utile, comme trouvé dans cette bibliothèque autonome .