2010-09-30 20 views
117

¿Alguien sabe de una forma muy rápida de reemplazar la última ocurrencia de una cadena con otra cuerda en una cadena?PHP ¿Reemplazar la última ocurrencia de una cadena en una cadena?

+0

Puede encontrar ['s ($ str) -> replaceLast ($ search, $ replace)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str. php # L305) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

183

Se puede utilizar esta función:

function str_lreplace($search, $replace, $subject) 
{ 
    $pos = strrpos($subject, $search); 

    if($pos !== false) 
    { 
     $subject = substr_replace($subject, $replace, $pos, strlen($search)); 
    } 

    return $subject; 
} 
+6

Por motivos de seguridad, agregaría un cheque que 'strrpos' no devuelve falso, pero de lo contrario está bien. – Wrikken

+1

Sí, tienes razón. Actualizaré mi respuesta. – Mischa

+0

Esto seguía siendo cierto sin importar nada.Considere modificarlo para que sea: if ($ pos) { $ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); \t return $ subject; } else { \t return false; } – Jazzy

4

Esto también funcionará:

function str_lreplace($search, $replace, $subject) 
{ 
    return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1); 
} 

ACTUALIZACIÓN versión un poco más concisa (http://ideone.com/B8i4o):

function str_lreplace($search, $replace, $subject) 
{ 
    return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1); 
} 
+0

¿Lo estoy haciendo mal? Si es así solo ignórame :) ||| echo str_lreplace ("x", "y", "esta x o esa x"); => Salida: "y" Ver: http://www.ideone.com/UXuTo – edorian

+0

@edorian: ¡Vaya! Lo siento, publiqué eso con prisa, la versión correcta está aquí: http://ideone.com/vR073. –

17
$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 
28

Otro 1-liner pero sin preg:

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

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

Sería divertido ver a alguien compararlo con el preg –

+0

FWIW, la solución aceptada es aproximadamente un 35% más rápida que esta solución. – JustCarty

0

Utilice el "$" en una expresión reg para que coincida con el final de la cadena

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

No creo que esto funcione. – crmpicco

+4

esto funciona solo si la última ocurrencia está en el final de la cadena http://ideone.com/nbNSNq – cawecoy

+1

Esto no funcionará si aparecen otros caracteres después del último 'zorro'. –

5

la siguiente solución más compacta utiliza el PCRE positive lookahead assertion para que coincida la última aparición de la subcadena de interés, es decir, una aparición de la subcadena que no es seguida por ninguna otra ocurrencia de la misma subcadena. Por lo tanto, el ejemplo reemplaza al last 'fox' con 'dog'.

$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; 
echo preg_replace('/(fox(?=.*fox.*))/', 'dog', $string); 

SALIDA:

The quick brown fox, fox, fox jumps over the lazy dog!!! 
+0

Parece que no funciona – Ivan

+3

La idea es buena, pero el código no lo es. Debe ser: '$ string = '¡El zorro marrón rápido, zorro, zorro salta sobre el zorro perezoso!'; echo preg_replace ('/ (zorro (?!. * Zorro)) /', 'perro', $ cadena); ' – Roemer

+0

De hecho, el código que publiqué cambia todas las instancias de" zorro ", excepto el último "perro", pero lo que queremos es exactamente lo contrario. Gracias por señalar que reemplazando? = Con?! arregla el problema –

2

Sólo una línea de código (respuesta tardía pero vale la pena añadir que):

$string = 'The quick brown fox jumps over the lazy dog'; 
$find_me = 'dog'; 

preg_replace('/'. $find_me .'$/', '', $string); 

el final $ indica el final de la cadena.

7

usted puede hacer esto:

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

El resultado es 'Hola John';

Saludos

+2

Esto funciona siempre que no haya caracteres repetidos. En mi situación, estoy eliminando el número de página de la fecha de archivo, así que tengo "2015-12/2" y quita todo/y todos 2 de la final convirtiéndose en "2015-1". – Mike

1

Puede utilizar strrpos() para encontrar último partido.

$string = "picture_0007_value"; 
$findChar =strrpos($string,"_"); 

$string[$findChar]="."; 

echo $string; 

Salida: picture_0007.value

2
$string = "picture_0007_value"; 
$findChar =strrpos($string,"_"); 
if($findChar !== FALSE) { 
    $string[$findChar]="."; 
} 

echo $string; 

Aparte de los errores en el código, Faruk Unal tiene la mejor anwser. Una función hace el truco.

+0

Debe verificar si ** $ findChar ** no es falso (de la misma manera que en la respuesta aceptada). Si la cadena no contiene cadenas buscadas, recibirá un aviso y el primer carácter será reemplazado. – shaggy

Cuestiones relacionadas