Funktion strpos() - Ermitteln der Position eines Strings
Zu den häufigen Aufgaben bei der Verarbeitung von Zeichenketten in PHP gehört, die Position einer bestimmte Zeichenfolge in einer Zeichenkette zu ermitteln. Das kann beispielsweise dann der Fall sein, wenn man prüfen will, ob eine übergebene Internetadresse mit http:// oder direkt mit www angegeben wurde. Für solche Überprüfungsaufgaben kann man in PHP die Funktion strpos() verwenden. Sie funktioniert genauso wie stripos(), nur mit dem Unterschied, dass die Groß- und Kleinschreibung beachtet wird (case-sensitive). Innerhalb der runden Klammern werden bis zu drei Parameter angegeben.
- Die Zeichenkette, in der nach dem Teil-String gesucht werden soll (haystack).
- Der Teil-String, nach dem in der Zeichenkette gesucht werden soll (needle).
- Die Startposition, ab der der Teil-String gesucht werden soll (offset, optional).
Beim folgenden Beispiel wird die Position des Buchstaben z in der Zeichenkette ermittelt. Dabei beginnt die Zählung mit 0. Der Rückgabewert ist ein Integer-Wert und in diesem Beispiel wird 25 zurückgegeben.
<?php
$str = 'abcdefghijklmnopqrstuvwxyz';
// Ausgabe 25
echo strpos($str, 'z');
?>
Der gesuchte Teil-String kann auch mehrere Zeichen enthalten. Dabei muss die Groß- und Kleinschreibung genau übereinstimmen. In dem folgenden Beispiel wird nach der Zeichenfolge xyz gesucht und der Rückgabewert ist 23.
<?php
$str = 'abcdefghijklmnopqrstuvwxyz';
// Ausgabe 23
echo strpos($str, 'xyz');
?>
Falls man den dritten Parameter (offset) angibt, wird der Teil-String ab der angegebenen Stelle gesucht. Die Position wird jedoch trotzdem von Beginn an gezählt. Beim folgenden Beispiel wird als dritter Parameter der Wert 5 angegeben und man könnte annehmen, dass der Rückgabewert 18 ist. Man erhält jedoch den Rückgabewert 23, da die Zählung von Beginn an erfolgt und nicht ab der Stelle, den man als offset angegeben hat. Ein Wert kleiner als 0 (negativer Wert) ist nicht möglich.
<?php
$str = 'abcdefghijklmnopqrstuvwxyz';
// Ausgabe 23
echo strpos($str, 'xyz', 5);
?>
Der Rückgabewert ist ein Integer-Wert, falls der Teil-String in der Zeichenkette gefunden wird. Falls nicht, ist es FALSE (Datentyp bool). Das kann im weiteren Programmverlauf zu Ungenauigkeiten führen. Denn, falls der Teil-String zu Beginn gefunden wird, wird der Integer-Wert 0 zurückgegeben, da die Zählung mit 0 beginnt. Falls man danach z.B. mit der if-, else-Abfrage ermittelt, ob der Rückgabewert FALSE ist, würde der Integer-Wert 0 ebenfalls als FALSE ausgewertet werden und das wäre nicht richtig.
Beim folgenden Code wird die Position des ersten Vorkommens von Zeichens a ermittelt und der Rückgabewert ist der Integer-Wert 0, da a sich am Anfang der Zeichenkette befindet. Danach wird mit einer if-, else-Abfrage und dem Vergleichsoperator == geprüft, ob der Rückgabewert FALSE ist. Da der Integer-Wert 0 als boolescher Wert FALSE ausgewertet wird, würde fälschlicherweise der Text "Zeichenkette enthält nicht a" ausgegeben werden.
<?php
$str = 'abcdefghijklmnopqrstuvwxyz';
// Rückgabe Integer-Wert 0
$pos = strpos($str, 'a');
if ($pos == FALSE)
{
echo 'Zeichenkette enthält nicht a';
}
else
{
echo 'Zeichenkette enthält a';
}
?>
In solchen Fällen eignen sich die Vergleichsoperatoren === (Gleichheit) oder !== (Ungleichheit), da hierbei auch eine Typprüfung vorgenommen wird. So wird vermieden, dass z.B. der Integer-Wert 0 als FALSE (Datentyp bool) ausgewertet wird.
<?php
$str = 'abcdefghijklmnopqrstuvwxyz';
// Rückgabe Integer-Wert 0
$pos = strpos($str, 'a');
if ($pos === FALSE)
{
echo 'Zeichenkette enthält nicht a';
}
else
{
echo 'Zeichenkette enthält a';
}
?>
Rückgabewert bei Multibyte-Zeichen in UTF-8
Eine weitere Ungenauigkeit kann entstehen, wenn man eine Zeichenkodierung wählt, bei der gewisse Zeichen mehr als 1 Byte belegen. Denn, mit strpos() wird genau genommen nicht die Anzahl der Zeichen gezählt, ab der ein Teil-String vorkommt, sondern die Anzahl der Bytes. Dabei wird davon ausgegangen, dass ein Zeichen 1 Byte belegt. Wie viel Byte ein Zeichen belegt, hängt jedoch von der Zeichenkodierung ab. Beispielsweise belegen die Umlaute in UTF-8 nicht 1 Byte sondern 2.
Beim folgenden Beispiel wird die Position des Zeichens ß ermittelt und der Rückgabewert ist 6, obwohl ß in der Zeichenkette bereits an der vierten Stelle vorkommt und man würde daher den Rückgabewert 3 erwarten.
<?php
$str = 'äöüß';
// Ausgabe 6
echo strpos($str, 'ß');
?>
Falls man eine Zeichenkodierung verwendet, bei der gewisse Zeichen mehr als 1 Byte belegen, kann man die sogenannte Multibyte-Funktion mb_strpos() verwenden. Hierbei kann man die zugrunde liegende Zeichenkodierung angeben und erhält dadurch genauere Rückgabewerte, da die Belegung von mehreren Bytes eines Zeichens berücksichtigt wird.