¿Alguien sabe de una manera muy rápida de reemplazar la última aparición de una cadena con otra cadena en una cadena?
¿Alguien sabe de una manera muy rápida de reemplazar la última aparición de una cadena con otra cadena en una cadena?
Respuestas:
Puedes usar 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;
}
TRUE
. Devuelve una cadena sin importar qué. Si no se puede hacer un reemplazo, devuelve el original $subject
, al igual que substr_replace
y str_replace
hacer.
strpos — Find the position of the first occurrence of a substring in a string
- editar: wow Los genios de PHP realmente hicieron una función llamada strpos
y strrpos
? Gracias ....
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
$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 siguiente solución bastante compacta utiliza la afirmación de búsqueda anticipada positiva de PCRE para que coincida con 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 aparición de la misma subcadena. Así, el ejemplo reemplaza el 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!!!
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Podrías hacer esto:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
El resultado es 'Hola John';
Saludos
rtrim
no se comporta de la manera que estás pensando. Eliminará desde el final cualquier carácter que exista en la cadena de búsqueda en cualquier orden (y siempre adjuntará el reemplazo), por ejemplo, "Hola palabra" -> "Hola John", "Hola señor" -> "Hola John", "Hola motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".
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 ligeramente más concisa ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Esta es una pregunta antigua, pero ¿por qué todos pasan por alto la solución más simple basada en expresiones regulares? ¡Los cuantificadores normales de expresiones regulares son codiciosos, gente! Si desea encontrar la última instancia de un patrón, simplemente quédese .*
frente a él. Así es cómo:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Esto reemplazará la última instancia de "zorro" a "PATO", como se supone que debe hacerlo, e imprimirá:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Además de los errores en el código, Faruk Unal tiene la mejor respuesta. Una función hace el truco.
Puede usar strrpos () para encontrar la última coincidencia.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Salida: picture_0007.value
Una versión corta:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Use 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'
Para los interesados: he escrito una función que utiliza preg_match para que pueda reemplazar desde el lado derecho usando 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;
}
O como una combinación / implementación abreviada de ambas opciones:
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;
}
basado en https://stackoverflow.com/a/3835653/3017716 y https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
útil, como se encuentra en esta biblioteca independiente .