173 votes

Remplacer la dernière occurrence d'une chaîne de caractères dans une chaîne de caractères

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 ?

Note, la dernière occurrence de la chaîne peut ne pas être le dernier caractère de la chaîne.

Exemple :

$search = 'The';
$replace = 'A';
$subject = 'The Quick Brown Fox Jumps Over The Lazy Dog';

Résultats attendus :

The Quick Brown Fox Jumps Over A Lazy Dog

0 votes

Vous pourriez trouver s($str)->replaceLast($search, $replace) utile, comme on le trouve dans cette bibliothèque autonome .

262voto

Mischa Points 26200

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;
}

0 votes

Cela revenait toujours vrai, quoi qu'il arrive. Envisagez de la modifier comme suit : if($pos) { $subject = substr_replace($subject, $replace, $pos, strlen($search)) ; return $subject ; } else { return false ; }

5 votes

@Jason Il ne revient pas TRUE quoi qu'il arrive. Il renvoie une chaîne de caractères, quoi qu'il arrive. S'il n'est pas possible de la remplacer, elle retourne l'original. $subject tout comme substr_replace et str_replace faire.

0 votes

@Mischa Ce n'est pas la même chose dans ce cas ? J'essayais de faire quelque chose comme !str_lreplace, mais si ça ne renvoie pas false, c'est considéré comme vrai, non ? Quoi qu'il en soit, cela m'a aidé et je l'apprécie. Merci.

32voto

ricka Points 133

Une autre doublure, mais sans grossesse :

$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';

echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer

5 votes

Pour information, la solution acceptée est environ 35% plus rapide que cette solution.

1 votes

Je choisirais toujours une fonction regex plutôt que 6 appels de fonction. Je ne peux pas imaginer voir cette technique employée dans du code professionnel.

27voto

zack Points 51
$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

0 votes

Pourquoi cela fonctionne-t-il avec toutes les cordes inversées ? Y a-t-il un gain de performance spécifique (je suppose) lors de l'utilisation d'expressions régulières ?

0 votes

Non, cela diminue les performances, mais c'est parce que vous voulez la dernière occurrence seulement, donc vous limitez la recherche à une seule occurrence et inversez tout. Si vous vouliez la première occurrence, vous n'auriez pas à inverser quoi que ce soit.

7voto

Alix Axel Points 63455

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);
}

0 votes

Est-ce que je m'y prends mal ? Si oui, ignorez-moi :) ||| echo str_lreplace("x", "y", "this x or that x") ; => Sortie : "y" Voir : ideone.com/UXuTo

0 votes

@edorian : Oups ! Désolé, j'ai posté ça à la hâte, la version correcte est ici : ideone.com/vR073 .

0 votes

Il manque à cette réponse son explication pédagogique.

-1voto

Neil Holcomb Points 178

Utiliser le "$" dans une expression reg pour correspondre à la fin de la chaîne de caractères

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

4 votes

Cela ne fonctionne que si la dernière occurrence est à la fin de la chaîne de caractères. ideone.com/nbNSNq

1 votes

Cela ne fonctionnera pas si d'autres caractères apparaissent après le dernier "fox".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X