2010-09-30 27 views
117

Wer weiß von einem sehr schnellen Weg, das letzte Vorkommen eines Strings durch einen anderen String in einem String zu ersetzen?PHP Das letzte Vorkommen eines Strings in einem String ersetzen?

+0

Sie könnten ['s ($ str) -> replaceLast ($ suchen, $ ersetzen)'] finden (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str. php # L305) hilfreich, wie in [diese eigenständige Bibliothek] (https://github.com/delight-im/PHP-Str) gefunden. – caw

Antwort

183

Sie diese Funktion nutzen zu können:

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

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

    return $subject; 
} 
+6

Aus Sicherheitsgründen würde ich hinzufügen, dass 'strrpos' nicht falsch zurückgibt, aber ansonsten OK. – Wrikken

+1

Ja, du hast Recht. Ich werde meine Antwort aktualisieren. – Mischa

+0

Dies war immer noch wahr, egal was passiert.Überlegen Sie, ob Sie es ändern möchten: if ($ pos) { $ subject = substr_replace ($ subject, $ ersetzen, $ pos, strlen ($ search)); \t Rückgabe $ Betreff; } sonst { \t Rückgabe false; } – Jazzy

4

Dies wird auch funktionieren:

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

UPDATE Etwas mehr Kurzfassung (http://ideone.com/B8i4o):

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

Mache ich es falsch? Wenn ja, ignorier mich einfach :) ||| echo str_lreplace ("x", "y", "dieses x oder das x"); => Ausgabe: "y" Siehe: http://www.ideone.com/UXuTo – edorian

+0

@edorian: Ups! Entschuldigung, ich habe es in Eile gepostet, die richtige Version ist hier: 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

Ein weiterer 1-Liner aber ohne 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

Wäre lustig zu sehen, jemand Benchmark dies gegen die Preg –

+0

FWIW, die akzeptierte Lösung ist etwa 35% schneller als diese Lösung. – JustCarty

0

das „$“ auf einem reg Ausdruck Verwenden Sie das Ende der Schnur

$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

Ich glaube nicht, dass das funktioniert. – crmpicco

+4

dies funktioniert nur, wenn das letzte Vorkommen am Ende der Zeichenfolge ist http://ideone.com/nbNSNq – cawecoy

+1

Dies funktioniert nicht, wenn nach dem letzten 'Fuchs' noch andere Zeichen erscheinen. –

5

Die folgende eher kompakte Lösung verwendet die PCRE positive lookahead assertion entsprechen anzupassen das letzte Vorkommen der interessierenden Teilzeichenfolge, dh ein Vorkommen der Teilzeichenfolge, auf das keine anderen Vorkommen derselben Teilzeichenfolge folgen. Somit ersetzt das Beispiel die last 'fox' durch 'dog'.

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

OUTPUT:

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

scheint nicht funktioniert – Ivan

+3

Die Idee ist gut, aber der Code ist nicht. Es muss sein: '$ string = 'Der schnelle braune Fuchs, Fuchs, Fuchs springt über den faulen Fuchs !!!'; echo preg_replace ('/ (fox (?!. * Fox)) /', 'Hund', $ string); ' – Roemer

+0

Tatsächlich ändert der Code, den ich gepostet habe, alle Instanzen von" fox "mit Ausnahme des letzten "Hund", aber was wir wollen, ist genau das Gegenteil. Danke, dass du darauf hingewiesen hast, dass du? = Mit? behebt das Problem. –

2

nur eine Zeile Code (späte Antwort, aber es lohnt sich hinzugefügt werden):

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

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

die Endung $ zeigt das Ende des Strings.

7

Sie können dies tun:

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

Ergebnis ist 'Hallo John';

Grüße

+2

Dies funktioniert, solange es keine wiederholten Zeichen gibt. In meiner Situation stripe ich die Seitenzahl vom Archivdatum ab, also habe ich "2015-12/2" und es dauert alle/und alle 2 am Ende werden "2015-1". – Mike

1

Sie strrpos() verwenden, können letztes Spiel zu finden.

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

$string[$findChar]="."; 

echo $string; 

Ausgang: picture_0007.value

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

echo $string; 

Neben den Fehler im Code, Faruk Unal hat die beste anwser. Eine Funktion macht den Trick.

+0

Sie müssen überprüfen, ob ** $ findChar ** nicht falsch ist (wie in der akzeptierten Antwort). Wenn die Zeichenfolge keine gesuchte Zeichenfolge enthält, erhalten Sie eine Benachrichtigung, und das erste Zeichen wird ersetzt. – shaggy

Verwandte Themen