Qualcuno sa di un modo molto veloce per sostituire l'ultima occorrenza di una stringa con un'altra stringa in una stringa?
Qualcuno sa di un modo molto veloce per sostituire l'ultima occorrenza di una stringa con un'altra stringa in una stringa?
Risposte:
Puoi usare questa funzione:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
qualunque cosa accada . Restituisce una stringa in ogni caso. Se la sostituzione non può essere fatta restituisce l'originale $subject
, proprio come substr_replace
e str_replace
fare.
strpos — Find the position of the first occurrence of a substring in a string
- modifica: wow. I geni Php hanno davvero creato una funzione chiamata strpos
e strrpos
? Grazie ....
Un altro 1-liner ma senza 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 seguente soluzione piuttosto compatta utilizza l' affermazione lookahead PCRE positiva per abbinare l'ultima occorrenza della sottostringa di interesse, ovvero un'occorrenza della sottostringa che non è seguita da altre occorrenze della stessa sottostringa. Quindi l'esempio sostituisce il last 'fox'
con 'dog'
.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
PRODUZIONE:
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);
Potresti farlo:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Il risultato è 'Hello John';
Saluti
rtrim
non si comporta nel modo in cui stai pensando. Eliminerà dalla fine tutti i caratteri presenti nella stringa di ricerca in qualsiasi ordine (e aggiungerà sempre la sostituzione), ad esempio "Ciao parola" -> "Ciao Giovanni", "Ciao signore" -> "Ciao Giovanni", "Ciao motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".
Questo funzionerà anche:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
AGGIORNAMENTO Versione leggermente più concisa ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Questa è una domanda antica, ma perché tutti trascurano la soluzione basata su regexp più semplice? I quantificatori di regexp normali sono golosi, gente! Se vuoi trovare l'ultima istanza di un pattern, ti basta attaccarlo .*
di fronte. Ecco come:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Questo sostituirà l' ultima istanza di "fox" in "DUCK", come dovrebbe, e stampa:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
A parte gli errori nel codice, Faruk Unal ha la risposta migliore. Una funzione fa il trucco.
Puoi usare strrpos () per trovare l'ultima corrispondenza.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Uscita: picture_0007.value
Una versione corta:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Utilizzare "$" su un'espressione reg per abbinare la fine della stringa
$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'
Per gli interessati: ho scritto una funzione che utilizza preg_match in modo che tu possa sostituire dal lato destro 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 come combinazione abbreviata / implementazione di entrambe le opzioni:
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;
}
basato su https://stackoverflow.com/a/3835653/3017716 e https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
utile, come si trova in questa libreria autonoma .