web-dev-qa-db-fra.com

PHP Remplacer la dernière occurrence d'une 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?

136
Kirk Ouimet

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

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
28
ricka
$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
25
zack

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!!!
9
John Sonderson

Vous pourriez faire ceci:

$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';

Le résultat est 'Hello John';

Cordialement

6
Nicolas Finelli

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.

5
Frank

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);
}
4
Alix Axel

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.
2
alexis
$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.

2
xwero

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

1
Faruk ÜNAL

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

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'
0
Neil Holcomb

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

0
Ken

Une version courte:

$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
0
Matthew Semik