Esto seguía volviendo cierto, no importa qué. Considere modificarlo para que sea: if ($ pos) {$ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); devolver $ sujeto; } else {return false; }
Jazzy
44
@ Jason No vuelve, pase lo que pase 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_replacehacer.
Mischa
@Mischa ¿No es lo mismo en este caso? Estaba intentando hacer algo como! Str_lreplace, pero si no devuelve falso, se considera cierto, ¿verdad? De cualquier manera, esto me ayudó y lo aprecio. Gracias.
Jazzy
1
¿Cómo puede funcionar esto? 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 strposy strrpos? Gracias ....
BarryBones41
1
@Barry, este es un caso en el que PHP no merece la culpa :-) Los nombres están modelados en las décadas de antigüedad strstr, strrstrde la biblioteca C estándar, que son las mismas funciones. (¿Pero que tienen que cambiar el nombre?)
FWIW, la solución aceptada es aproximadamente un 35% más rápida que esta solución.
JustCarty
27
$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 mejor solución en mi opinión y aún fácil de entender.
Blackbam
¿Por qué funciona con todas las cadenas invertidas? ¿Hay alguna (supongo) ganancia de rendimiento específica cuando se usan expresiones regulares?
Kamafeather
No, en realidad disminuye el rendimiento, pero se debe a que solo quieres la última aparición, así que limitas la búsqueda a una y reviertes todo si quisieras lo primero, no tendrías que revertir nada
Tofandel
15
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!!!
La idea es buena, pero el código no lo es. Debe ser:$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Roemer
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 reemplazar? = Con?! soluciona el problema
Esto funciona siempre que no haya caracteres repetidos. En mi situación, estoy quitando el número de página de la fecha de archivo, así que tengo "2015-12 / 2" y quita todo / y todos los 2 al final convirtiéndose en "2015-1".
Mike
Esto solo funcionará si la última aparición buscada es la última palabra y no tiene caracteres adicionales después.
AwesomeGuy
Esto no funciona porque rtrimno 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 ".
Jake
5
Esto también funcionará:
function str_lreplace($search, $replace, $subject){return preg_replace('~(.*)'. preg_quote($search,'~').'(.*?)~','$1'. $replace .'$2', $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.
¡Gracias! La función perfecta para envolver mi expresión para lograr esto. En mi caso, estoy reemplazando la última coma con ", y". Me alegro de haberme desplazado un poco hacia abajo en esta lista de respuestas.
Debe verificar si $ findChar no es falso (de la misma manera que en la respuesta aceptada). Si la cadena no contiene la cadena buscada, recibirá un aviso y el primer carácter será reemplazado.
peludo
Esto es genial, pero tal como está, solo puede reemplazar 1 personaje con 1 personaje.
Pete
3
Puede usar strrpos () para encontrar la última coincidencia.
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'
s($str)->replaceLast($search, $replace)
útil, como se encuentra en esta biblioteca independiente .Respuestas:
Puedes usar esta función:
fuente
TRUE
. Devuelve una cadena sin importar qué. Si no se puede hacer un reemplazo, devuelve el original$subject
, al igual quesubstr_replace
ystr_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 llamadastrpos
ystrrpos
? Gracias ....strstr
,strrstr
de la biblioteca C estándar, que son las mismas funciones. (¿Pero que tienen que cambiar el nombre?)Otro 1-liner pero sin preg:
fuente
fuente
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'
.SALIDA:
fuente
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Podrías hacer esto:
El resultado es 'Hola John';
Saludos
fuente
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á:
ACTUALIZACIÓN Versión ligeramente más concisa ( http://ideone.com/B8i4o ):
fuente
Solo una línea de código (respuesta tardía pero vale la pena agregarlo):
el final $ indica el final de la cadena.
fuente
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:Esto reemplazará la última instancia de "zorro" a "PATO", como se supone que debe hacerlo, e imprimirá:
fuente
Además de los errores en el código, Faruk Unal tiene la mejor respuesta. Una función hace el truco.
fuente
Puede usar strrpos () para encontrar la última coincidencia.
Salida: picture_0007.value
fuente
Taquigrafía para la respuesta aceptada
fuente
Una versión corta:
fuente
Use el "$" en una expresión reg para que coincida con el final de la cadena
fuente
Para los interesados: he escrito una función que utiliza preg_match para que pueda reemplazar desde el lado derecho usando regex.
O como una combinación / implementación abreviada de ambas opciones:
basado en https://stackoverflow.com/a/3835653/3017716 y https://stackoverflow.com/a/23343396/3017716
fuente