Kennt jemand eine sehr schnelle Möglichkeit, das letzte Vorkommen einer Zeichenfolge durch eine andere Zeichenfolge in einer Zeichenfolge zu ersetzen?
Kennt jemand eine sehr schnelle Möglichkeit, das letzte Vorkommen einer Zeichenfolge durch eine andere Zeichenfolge in einer Zeichenfolge zu ersetzen?
Antworten:
Sie können diese Funktion verwenden:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
egal was passiert . Es gibt eine Zeichenfolge zurück, egal was passiert. Wenn ein Ersatz kann nicht gemacht werden , es gibt das Original $subject
, wie substr_replace
und str_replace
tut.
strpos — Find the position of the first occurrence of a substring in a string
- bearbeiten: wow. PHP-Genies haben wirklich eine Funktion namens strpos
und strrpos
? Danke ....
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
$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
Die folgende ziemlich kompakte Lösung verwendet die PCRE-positive Lookahead-Behauptung , um mit dem letzten Auftreten des interessierenden Teilstrings übereinzustimmen, d. H. Einem Auftreten des Teilstrings, dem keine anderen Vorkommen desselben Teilstrings folgen. Somit ersetzt das Beispiel das last 'fox'
mit 'dog'
.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
AUSGABE:
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);
Sie könnten dies tun:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Ergebnis ist 'Hallo John';
Grüße
rtrim
sich nicht so verhalten, wie Sie denken. Am Ende werden alle Zeichen, die in der Suchzeichenfolge vorhanden sind, in beliebiger Reihenfolge entfernt (und immer die Ersetzung angehängt), z. B. "Hallo Wort" -> "Hallo John", "Hallo Herr" -> "Hallo John", "Hallo" motor "->" Hallo motJohn "," Hallo worldy "->" Hallo worldyJohn ".
Dies wird auch funktionieren:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
UPDATE Etwas prägnantere Version ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Dies ist eine alte Frage, aber warum übersehen alle die einfachste Regexp-basierte Lösung? Normale Regexp-Quantifizierer sind gierig, Leute! Wenn Sie die letzte Instanz eines Musters finden möchten, bleiben Sie einfach .*
davor. Hier ist wie:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Dies ersetzt die letzte Instanz von "fox" durch "DUCK", wie es sein soll, und druckt:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Abgesehen von den Fehlern im Code hat Faruk Unal die beste Antwort. Eine Funktion macht den Trick.
Sie können strrpos () verwenden, um die letzte Übereinstimmung zu finden.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Ausgabe: picture_0007.value
Eine kurze Version:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Verwenden Sie das "$" für einen reg-Ausdruck, um mit dem Ende der Zeichenfolge übereinzustimmen
$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'
Für Interessierte: Ich habe eine Funktion geschrieben, die preg_match verwendet, damit Sie sie mithilfe von Regex von rechts ersetzen können.
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;
}
Oder als Kurzkombination / Implementierung beider Optionen:
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;
}
basierend auf https://stackoverflow.com/a/3835653/3017716 und https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
hilfreiche Informationen in dieser eigenständigen Bibliothek .