strrpos()
Die PHP-Funktion strrpos() findet das letzte Vorkommen eines Teilstrings in einem String und gibt dessen nullbasierte Position zurück.
Einführung
Die Funktion strrpos() findet das letzte Vorkommen eines Teilstrings innerhalb eines Strings und gibt dessen nullbasierte Position zurück (den Index des ersten Zeichens). Sie ist das Spiegelbild von strpos(), das das erste Vorkommen findet: strpos() sucht von links nach rechts, strrpos() gibt die rechteste Übereinstimmung zurück.
strrpos() wird verwendet, wenn man am Ende eines Strings interessiert ist — etwa um eine Dateiendung nach dem letzten Punkt zu ermitteln, einen Pfad am letzten Schrägstrich zu teilen oder alles nach dem letzten Trennzeichen zu entfernen.
Diese Seite behandelt die Syntax, die leicht zu übersehende false/0-Falle, wie der Parameter $offset (einschließlich negativer Werte) die Suche eingrenzt, und das Gegenstück für Groß-/Kleinschreibung-unabhängige Suchen strripos().
Syntax
strrpos(string $haystack, string $needle, int $offset = 0): int|false| Parameter | Beschreibung |
|---|---|
$haystack | Der String, in dem gesucht wird. |
$needle | Der Teilstring, nach dem gesucht wird. |
$offset | Optional. Ändert, wo die Suche beginnt oder endet. Ein positiver Offset startet die Suche so viele Zeichen vom Anfang; ein negativer Offset stoppt die Suche so viele Zeichen vor dem Ende. |
Rückgabewert: die ganzzahlige Position (gezählt ab 0) der letzten Übereinstimmung, oder false, wenn $needle in $haystack nicht vorkommt. Die Position ist ein Byte-Offset; bei Multibyte-Text (UTF-8-Akzente, Emoji) sollte stattdessen mb_strrpos() verwendet werden.
Verwendungsbeispiel
Hier ist ein Beispiel für die Verwendung der Funktion strrpos() in PHP:
Beispiel für PHP strrpos()
"Hello World" enthält zwei o-Zeichen — an Index 4 und Index 7. Da strrpos() das letzte zurückgibt, lautet die Ausgabe:
Found last occurrence of 'o' in 'Hello World' at position 7Immer mit === / !== false vergleichen
Dies ist der Fehler, der jeden trifft. Wenn die Übereinstimmung am Anfang des Strings steht, gibt strrpos() 0 zurück, und PHP behandelt 0 als falsy. Eine lockere Prüfung wie if ($result) würde dann fälschlicherweise schlussfolgern "nicht gefunden":
<?php
// "h" is at position 0, so strrpos returns 0
$pos = strrpos("hello", "h");
if ($pos == false) { // WRONG: 0 == false is true
echo "not found"; // this prints, even though "h" WAS found
} else {
echo "found at $pos";
}Die Lösung ist der strikte Operator !== false (wie im ersten Beispiel verwendet), der die Ganzzahl 0 von dem booleschen Wert false unterscheidet.
Suche mit $offset eingrenzen
Ein negativer Offset ist die nützlichste Form: Er weist strrpos() an, die Suche so viele Zeichen vor dem Ende zu stoppen, was praktisch ist, um einen abschließenden Teil des Strings zu ignorieren.
<?php
$path = "a/b/c/d";
// Last slash overall:
echo strrpos($path, "/"); // 5
// Last slash, ignoring the final 2 chars ("/d"):
echo "\n";
echo strrpos($path, "/", -3); // 3Ein positiver Offset beginnt die Suche so viele Zeichen vom Anfang und überspringt frühere Übereinstimmungen.
Groß-/Kleinschreibung-unabhängige Suche: strripos()
strrpos() unterscheidet Groß- und Kleinschreibung — strrpos("FOO", "o") gibt false zurück. Wenn die Schreibweise keine Rolle spielen soll, kann strripos() verwendet werden, das die gleiche Signatur hat, aber unabhängig von Groß- und Kleinschreibung übereinstimmt:
<?php
$str = "PHP is the Programming language: php";
echo strrpos($str, "php"); // 33 (only the lowercase one matches)
echo "\n";
echo strripos($str, "php"); // 33 (right-most match, ignoring case)Verwandte Funktionen
strpos()— Position des ersten Vorkommens.stripos()— erstes Vorkommen, Groß-/Kleinschreibung-unabhängig.substr()— extrahiert den Teil des Strings nach der gefundenen Position.str_replace()— ersetzt Vorkommen, ohne deren Position zu benötigen.
Fazit
strrpos() gibt die Byte-Position des letzten Vorkommens eines Teilstrings zurück, oder false, wenn keines vorhanden ist — daher sollte das Ergebnis immer mit !== false verglichen werden. Kombiniert mit einem negativen $offset lässt sich abschließender Text ignorieren; mit strripos() wird Groß-/Kleinschreibung-unabhängig gesucht; und bei Multibyte-Zeichen im String sollte mb_strrpos() verwendet werden.