Funktion strstr() - Das Vorkommen eines Strings suchen

Bei der Verarbeitung von Zeichenketten müssen häufig gewisse Zeichen gesucht werden. Ein typisches Beispiel ist, wenn die Postleitzahl und der Ort zusammenhängend vorliegen und man eine Trennung möchte, sodass man nur die Postleitzahl oder den Ort für die weitere Verarbeitung bereithält. Hierbei kann man z.B. nach dem ersten Leerzeichen suchen und die restlichen Zeichen weiter verarbeiten. Für solche Aufgaben kann man die Funktion strstr() verwenden. Innerhalb der runden Klammern werden die Parameter 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. Ein boolescher Wert, mit dem man den Rückgabewert beeinflusst (before_needle, optional).

In der Standardeinstellung werden die restlichen Zeichen nach dem gesuchten Teil-String zurückgegeben (inkl. dem Teil-String). Das führt im folgenden Beispiel dazu, dass Musterhausen inkl. dem gesuchten Leerzeichen davor zurückgegeben wird.

<?php

$str = '01234 Musterhausen';
$needle = ' ';

// Ausgabe  Musterhausen
echo strstr($str, $needle);

?>

Falls man den gesuchten Teil-String nicht zurückgeben lassen möchte, kann man die Funktion strstr() mit der Funktion substr() kombinieren. Beim folgenden Beispielcode wird in der Zeichenkette nach einem Leerzeichen gesucht und die restlichen Zeichen werden inkl. dem Leerzeichen zurückgegeben. Die Funktion substr() sorgt dafür, dass das erste Zeichen abgeschnitten wird.

<?php

$str = '01234 Musterhausen';
$needle = ' ';

// Ausgabe Musterhausen
echo substr(strstr($str, $needle), 1);

?>

Der gesuchte Teil-String kann nicht nur aus einem Zeichen bestehen. Im folgenden Beispielcode wird nach der Zeichenfolge 234 gesucht und mit dem Rest zurückgegeben. Mit substr() werden wiederum die ersten 4 Zeichen abgeschnitten.

<?php

$str = '01234 Musterhausen';
$needle = '234';

// Ausgabe Musterhausen
echo substr(strstr($str, $needle), 4);

?>

Es ist auch möglich, die Zeichen vor dem gesuchten Teil-String zurückgeben zu lassen. In dem Fall muss man den dritten Parameter auf TRUE setzen, der per Standard auf FALSE gesetzt ist. Die Besonderheit ist hierbei, dass der gesuchte Teil-String nicht mit zurückgegeben wird. Beim folgenden Beispiel werden die Ziffern 01234 zurückgegeben (ohne Leerzeichen).

<?php

$str = '01234 Musterhausen';
$needle = ' ';

// Ausgabe 01234
echo strstr($str, $needle, TRUE);

?>

Falls der dritte Parameter nicht angegeben wurde, ist der Rückgabewert der Funktion strstr() die restliche Zeichenkette inkl. dem gesuchten Teil-String. Falls der Teil-String nicht gefunden wird, ist der Rückgabewert FALSE. Falls der gesuchte Teil-String 0 ist und das Zeichen im String als letztes Zeichen vorkommt, ist der Rückgabewert das Zeichen 0 und vom Datentyp string. Das führt bei einer anschließenden if-, else-Abfrage auf FALSE und dem Vergleichsoperator == dazu, dass der Rückgabewert als boolescher Wert FALSE ausgewertet wird und das wäre nicht richtig, weil das Zeichen 0 gefunden wurde. In dem Fall sollte man als Vergleichsoperator === verwenden, da hiermit auch der Datentyp geprüft wird.

<?php

$str = '9876543210';
$needle = '0';

// Rückgabewert in $a speichern
$a = strstr($str, $needle);

if ($a === FALSE)
{
  echo 'Needle nicht gefunden';
}
else
{
  echo 'Needle gefunden';
}

?>

Bei der Verwendung der Funktion strstr() in Verbindung mit substr() und der Zeichenkodierung UTF-8 kann es zu fehlerhaften Rückgabewerten kommen, da mit substr() lediglich die Anzahl der Bytes angegeben wird, die vom String abgeschnitten werden. Nicht alle Zeichen belegen jedoch nur 1 Byte und das hängt vor allem von der gewählten Zeichenkodierung ab. Beispielsweise werden in UTF-8 durch die Umlaute 2 Bytes belegt. In solchen Fällen kann man statt substr() die Multibyte-Funktion mb_substr() verwenden, damit die Belegung von mehreren Bytes eines Zeichens berücksichtigt wird.

<?php

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

// Ausgabe äöü
echo mb_substr(strstr($str, $needle), 1, null, 'UTF-8');

?>

Analog zur Funktion strstr() gibt es auch die Multibyte-Funktion mb_strstr(). Die Funktion strstr() ist ähnlich wie strpos(). Der Unterschied zwischen den beiden Funktionen ist, dass man bei strstr() als Rückgabewert die restliche Zeichenkette erhält, bei strpos() dagegen eine numerische Angabe über die Position des gesuchten Teil-Strings. Die Funktion strstr() ist case-sensitive. Falls die Suche nach dem Teil-String nicht case-sensitive erfolgen soll, kann man die Funktion stristr() verwenden. Diese verhält sich wie strstr(), unterscheidet jedoch nicht zwischen Groß- und Kleinschreibung.