2010-09-30 30 views
117

Qualcuno sa di un modo molto veloce per sostituire l'ultima occorrenza di una stringa con un'altra stringa in una stringa?PHP Sostituisce l'ultima occorrenza di una stringa in una stringa?

+0

È possibile trovare ['s ($ str) -> replaceLast ($ search, $ replace)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str. php # L305) utile, come trovato in [questa libreria standalone] (https://github.com/delight-im/PHP-Str). – caw

risposta

183

È possibile utilizzare 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; 
} 
+6

Per motivi di sicurezza, aggiungerei un controllo per confermare che 'strrpos' non restituisce false, ma altrimenti OK. – Wrikken

+1

Sì, hai ragione. Aggiornerò la mia risposta – Mischa

+0

Questo ritornava ancora vero, non importa cosa.Considera di modificarlo: if ($ pos) { $ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); \t return $ subject; } altro { \t reso falso; } – Jazzy

4

Questo funziona anche:

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

UPDATE versione leggermente più concisa (http://ideone.com/B8i4o):

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

Sto sbagliando? Se è così, ignorami :) ||| echo str_lreplace ("x", "y", "questo xo quella x"); => Output: "y" Vedi: http://www.ideone.com/UXuTo – edorian

+0

@edorian: Oops! Scusa, l'ho postata in fretta, la versione corretta è qui: 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

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 
+11

Sarebbe divertente vedere qualcuno confrontarlo con il preg –

+0

FWIW, la soluzione accettata è circa il 35% più veloce di questa soluzione. – JustCarty

0

utilizzare il "$", a 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' 
+1

Non penso che funzioni. – crmpicco

+4

funziona solo se l'ultima occorrenza si trova alla fine della stringa http://ideone.com/nbNSNq – cawecoy

+1

Questo non funzionerà se altri caratteri compaiono dopo l'ultima "volpe". –

5

La seguente soluzione piuttosto compatto utilizza il PCRE positive lookahead assertion per abbinare l'ultima occorrenza della sottostringa di interesse, ovvero un'occorrenza della sottostringa che non è seguita da altre occorrenze della stessa sottostringa. Pertanto, l'esempio sostituisce last 'fox' con 'dog'.

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

USCITA:

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

sembra non funzionare – Ivan

+3

L'idea è buona, ma il codice non lo è. Deve essere: '$ string = 'La volpe marrone veloce, la volpe, la volpe salta sopra la volpe pigra !!!'; echo preg_replace ('/ (fox (?!. * Fox)) /', 'dog', $ stringa); ' – Roemer

+0

In effetti, il codice che ho postato cambia tutte le istanze di" volpe "tranne l'ultima a "cane", ma ciò che vogliamo è esattamente l'opposto. Grazie per aver sottolineato che la sostituzione? = Con?! risolve il problema –

2

una sola riga di codice (risposta in ritardo, ma vale la pena di aggiungerlo):

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

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

il finale $ indica la fine della stringa.

7

Si potrebbe fare questo:

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

Il risultato è 'Ciao Giovanni';

saluti

+2

Questo funziona fintanto che non ci sono caratteri ripetuti. Nella mia situazione sto spogliando il numero della pagina dalla data dell'archivio, quindi ho "2015-12/2" e ci sono tutti/e tutti e 2 gli altri che diventano "2015-1". – Mike

1

È possibile utilizzare strrpos() per trovare ultima partita.

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

$string[$findChar]="."; 

echo $string; 

uscita: picture_0007.value

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

echo $string; 

A parte gli errori nel codice, Faruk Unal ha il miglior anwser. Una funzione fa il trucco.

+0

È necessario controllare, se ** $ findChar ** non è falso (come nella risposta accettata). Se la stringa non contiene una stringa cercata, viene visualizzato un avviso e il primo carattere verrà sostituito. – shaggy

Problemi correlati