Funktion stripos() - Vorkommen eines strings ermitteln

In Zeichenketten müssen häufig ermittelt werden, ob und an welcher Position bestimmte Zeichenfolgen vorkommen. Wenn ein String beispielsweise aus Ziffern und einem Komma besteht, könnte man ermitteln, wie viele Ziffern vor dem Komma vorhanden sind. Für solche Aufgaben kann man die PHP-Funktion stripos() verwenden. Diese funktioniert wie strpos(), jedoch mit dem Unterschied, dass die Groß- und Kleinschreibung unberücksichtigt wird. Der Rückgabewert ist die Position in der Zeichenkette, in der ein gesuchter Teil-String vorkommt. Innerhalb der runden Klammern werden die folgenden Parameter 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 in der Zeichenkette nach dem Buchstaben z gesucht. Die Zählung beginnt ab der Position 0 (das erste Zeichen), sodass der Rückgabewert hierbei 25 ist.

<?php

$str = 'abcdefghijklmnopqrstuvwxyz';

// Ausgabe 25
echo stripos($str, 'z');

?>

Der Teil-String, nach dem gesucht wird, kann auch aus mehreren Zeichen bestehen. Beim folgenden Beispiel wird nach dem Teil-String xyz gesucht und der Rückgabewert ist 23. Die Groß- und Kleinschreibung spielt dabei keine Rolle.

<?php

$str = 'abcdefghijklmnopqrstuvwxyz';

// Ausgabe 23
echo stripos($str, 'XYZ');

?>

Die Angabe des dritten Parameters (offset) bezieht lediglich auf die Stelle, ab der in der Zeichenkette das Vorkommen des Teil-Strings gesucht werden soll. Der Rückgabewert bezieht sich dabei nach wie vor auf die gesamte Zeichenkette. Beim folgenden Beispiel wird als offset der Wert 10 angegeben und man könnte annehmen, dass der Rückgabewert 13 ist, da der Teil-String erst nach dem 10. Zeichen gesucht wird. Das ist jedoch nicht der Fall und man erhält nach wie vor den Rückgabewert 23. Die Angabe von Werten kleiner als 0 (negative Werte) für den offset ist nicht möglich.

<?php

$str = 'abcdefghijklmnopqrstuvwxyz';

// Ausgabe 23
echo stripos($str, 'XYZ', 10);

?>

Der Rückgabewert der Funktion ist ein Integer-Wert. Falls der Teil-String nicht gefunden wird, ist der Rückgabewert FALSE (vom Typ bool). Hierbei kann es im weiteren Programmverlauf zu unrichtigen Ergebnissen kommen, da z.B. der Integer-Wert 0 (falls der Teil-String zu Beginn gefunden wird) bei einer if-, else-Abfrage ebenfalls als FALSE ausgewertet wird.

Beim folgenden Beispielcode wird das Vorkommen des Zeichens a untersucht. Der Rückgabewert der Funktion stripos() ist 0 (Typ int), da das Zeichen a zu Beginn der Zeichenkette vorkommt. Danach wird mit einer if-, else-Abfrage überprüft, ob der Rückgabewert FALSE ist, was zutreffen würde, falls das Zeichen nicht in der Zeichenkette vorkommt. In diesem Fall würde der Integer-Wert 0 als boolescher Wert FALSE interpretiert werden und das wäre unrichtig (da das Zeichen vorkommt).

<?php

$str = 'abcdefghijklmnopqrstuvwxyz';

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

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

?>

Bei einer Abfrage des Rückgabewerts kann man die Vergleichsoperatoren === (auf Gleichheit) oder !== (auf Ungleichheit) verwenden, womit auch eine Typprüfung vorgenommen wird. So wird z.B. vermieden, dass beim Vorkommen des Teil-Strings zu Beginn der Rückgabewert 0 der Funktion stripos() bei der anschließenden if-, else-Abfrage als FALSE ausgewertet wird.

<?php

$str = 'abcdefghijklmnopqrstuvwxyz';

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

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

?>

Rückgabewert von stripos() bei Multibyte-Zeichen in UTF-8

Genau genommen werden mit stripos() nicht die Anzahl der Zeichen gezählt, ab der ein Teil-String in der Zeichenkette vorkommt, sondern die Anzahl der Bytes, die diese belegen. Hierbei wird davon ausgegangen, dass ein Zeichen 1 Byte belegt. Das kann bei sogenannten Multibyte-Zeichen zu fehlerhaften Rückgabewerten führen, da diese (abhängig von der Zeichenkodierung) auch mehr als 1 Byte belegen können. Beispielsweise belegen die Umlaute ä, ö und ü in der Zeichenkodierung UTF-8 jeweils 2 Bytes. Beim folgenden Beispiel ist der Rückgabewert von stripos() der Integer-Wert 6, obwohl das Zeichen ß bereits an der vierten Stelle in der Zeichenkette vorkommt und man daher den Rückgabewert 3 erwarten würde.

<?php

$str = 'äöüß';

// Ausgabe 6
echo stripos($str, 'ß');

?>

Falls man die Zeichenkodierung UTF-8 verwendet und somit z.B. die Umlaute mehr als 1 Byte belegen, kann man die Multibyte-Funktion mb_stripos() verwenden. Hierbei erhält man genauere Rückgabewerte, da man als Parameter auch die Zeichenkodierung angeben kann und der Rückgabewert nicht nur bloß der Anzahl der Bytes entspricht, die gewisse Zeichen belegen.