Funktion strrpos() - Position des letzten Vorkommens eines Zeichens suchen

Bei der Verarbeitung von Zeichenketten kann es passieren, dass man vor der Aufgabe steht, die Position des letzten Vorkommens eines Teil-Strings zu ermitteln. Wenn beispielsweise eine Zeichenkette mit Ziffern mehrere Punkte als Tausender-Trennzeichen enthält und man nach dem letzten Punkt suchen lässt, kann man daraus Rückschlüsse auf die Anzahl der vorhandenen Stellen vor dem letzten Trennzeichen ziehen. Für solche Aufgaben kann man die Funktion strrpos() verwenden. Die Parameter werden innerhalb der runden Klammern wie folgt angegeben.

  1. Die Zeichenkette, in der nach dem Teil-String gesucht werden soll (haystack).
  2. Der Teil-String, nach dem in der Zeichenkette gesucht werden soll (needle).
  3. Die Startposition, ab der der Teil-String gesucht werden soll (offset, optional).

Beim folgenden Beispiel wird nach dem letzten Punkt gesucht. Der Rückgabewert der Funktion ist 9.

<?php

$str = '1.000.000.000';
$needle = '.';

// Ausgabe 9
echo strrpos($str, $needle);

?>

Der gesuchte Teil-String kann auch aus mehreren Zeichen bestehen. In dem Fall werden bei der Suche alle Zeichen des Teil-Strings sowie die Anordnung der einzelnen Zeichen berücksichtigt (die Zeichen des Teil-Strings gelten zusammenhängend). Beim folgenden Beispiel wird nach der Zeichenfolge 0. gesucht. Der Rückgabewert ist 8.

<?php

$str = '1.000.000.000';
$needle = '0.';

// Ausgabe 8
echo strrpos($str, $needle);

?>

Mit dem dritten Parameter wird angegeben, ab welcher Position die Suche beginnen soll. Beim folgenden Beispiel ist der Rückgabewert FALSE und am Bildschirm wird nichts ausgegeben, da das gesuchte Zeichen a zu Beginn der Zeichenkette vorkommt, die Suche jedoch nach dem ersten Zeichen beginnt.

<?php

$str = 'abcd';
$needle = 'a';

// Ausgabe
echo strrpos($str, $needle, 1);

?>

Die Funktion strrpos() ist case-sensitive. Es wird somit zwischen Groß- und Kleinschreibung unterschieden. Beim folgenden Beispiel ist der Rückgabewert 0, da das Zeichen a an erster Stelle vorkommt. Zeichen A wird dagegen nicht berücksichtigt.

<?php

$str = 'abcdABCD';
$needle = 'a';

// Ausgabe 0
echo strrpos($str, $needle);

?>

Der Rückgabewert gibt die Position des gesuchten Teil-Strings an und ist vom Typ Integer. Falls der Teil-String nicht gefunden wird, ist der Rückgabewert FALSE (Typ bool). Das kann zu Unstimmigkeiten führen, wenn man nach einem Teil-String sucht, der in der Zeichenkette nur zu Beginn (Position 0) vorkommt, da in dem Fall der Integer-Wert 0 zurückgegeben wird.

Denn, bei einer anschließenden if-, else-Abfrage mit dem Vergleichsoperator == auf FALSE wird der Integer-Wert 0 als boolescher Wert FALSE ausgewertet und das wäre nicht richtig, da der Integer-Wert 0 das Vorkommen des Teil-Strings zu Beginn der Zeichenkette angibt und FALSE gibt an, dass der Teil-String nicht enthalten ist. In solchen Fällen sollte man wie im folgenden Beispiel den Vergleichsoperator === einsetzen, da hiermit auch der Datentyp eines Werts überprüft wird.

<?php

$str = 'abcd';

// Rückgabe Integer-Wert 0
$pos = strrpos($str, 'a');

if ($pos === FALSE)
{
  echo 'Zeichenkette enthält nicht a';
} 
else
{
  echo 'Zeichenkette enthält a';
}

?>

Bei sogenannten Multibyte-Zeichen funktioniert strrpos() nur bedingt. Denn, bei der Suche nach dem letzten Vorkommen des gesuchten Teil-Strings werden nicht die Anzahl der Zeichen gezählt, sondern die Anzahl der Bytes, die diese belegen. Hierbei wird davon ausgegangen, dass jedes Zeichen 1 Byte belegt.

Wie viele Bytes ein Zeichen belegt, hängt jedoch von der Zeichenkodierung ab. Die Umlaute belegen z.B. in der Zeichenkodierung UTF-8 zwei Bytes. Beim folgenden Beispiel ist der Rückgabewert 6, obwohl das gesuchte Zeichen ß sich bereits an vierter Stelle befindet.

<?php

$str = 'äöüßÄÖÜ';
$needle = 'ß';

// Ausgabe 6
echo strrpos($str, $needle);

?>

Falls man eine Zeichenkodierung wie z.B. UTF-8 verwendet, in der gewisse Zeichen mehr als 1 Byte belegen, kann man statt strrpos() die Multibyte-Funktion mb_strrpos() verwenden. Hierbei ist es möglich, auch die Zeichenkodierung anzugeben, sodass die Belegung von mehreren Bytes eines Zeichens berücksichtigt wird.