Funktion stristr() - String nicht case-sensitive suchen

In PHP-Programmen müssen Zeichenketten häufig auf bestimmte Vorkommen von Zeichen untersucht werden. Beispielsweise wird bei E-Mailadressen das Vorkommen des Zeichens @ geprüft. Es könnte auch sein, dass die Postleitzahl und der Ort zusammenhängend vorliegt und an der Stelle des Leerzeichens getrennt werden muss. Für solche Aufgaben kann man die Funktion stristr() verwenden. Sie funktioniert im Grunde genauso wie strstr(), nur mit dem Unterschied, dass stristr() nicht case-sensitive ist und somit die Groß- und Kleinschreibung keine Rolle spielt. 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. Ein boolescher Wert, mit dem man den Rückgabewert beeinflusst (before_needle, optional).

Gemäß der Standardeinstellung ist der Rückgabewert der Funktion der gesuchte Teil-String sowie die restlichen Zeichen. Beim folgenden Beispiel wird nach dem Vorkommen des Leerzeichens gesucht und man erhält als Rückgabewert den Text Musterhausen (inkl. dem Leerzeichen).

<?php

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

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

?>

Falls der gesuchte Teil-String nicht im Rückgabewert enthalten sein soll, kann man die Funktion stristr() mit substr() kombinieren und den unerwünschten Teil-String abschneiden. Beim folgenden Beispiel wird die Zeichenkette nach dem Zeichen @ durchsucht. Der Rückgabewert wird jedoch ohne das Zeichen @ ausgegeben und man erhält den Text provider.xyz.

<?php

$str = 'emailadresse@provider.xyz';
$needle = '@';

// Ausgabe provider.xyz
echo substr(stristr($str, $needle), 1);

?>

Man kann auch das Vorkommen von mehreren Zeichen suchen lassen. Die Groß- und Kleinschreibung spielt bei stristr() keine Rolle. Beim folgenden Beispiel wird nach EMAIL gesucht. 

<?php

$str = 'emailadresse@provider.xyz';
$needle = 'EMAIL';

// Ausgabe emailadresse@provider.xyz
echo stristr($str, $needle);

?>

Falls man den dritten Parameter auf TRUE setzt, werden die Zeichen vor dem gesuchten Teil-String zurückgegeben. Beim folgenden Beispiel wird nach dem Teil-String .xyz gesucht. Der Rückgabewert ist der Text davor (ohne needle).

<?php

$str = 'emailadresse@provider.xyz';
$needle = '.xyz';

// Ausgabe emailadresse@provider
echo stristr($str, $needle, TRUE);

?>

Falls nach dem Zeichen 0 gesucht wird, gibt es eine Besonderheit zu beachten. Sofern der dritte Parameter nicht auf TRUE gesetzt wurde, enthält der Rückgabewert der Funktion stristr() die restlichen Zeichen ab dem Vorkommen des gesuchten Strings (inkl. dem gesuchten Teil-String). Falls der gesuchte Teil-String nicht gefunden wird, ist der Rückgabewert FALSE (bool).

Wenn nach dem Zeichen 0 gesucht wird und das Zeichen als letztes in der Zeichenkette vorkommt, kann der Rückgabewert 0 (Typ string) bei einer if-, else-Abfrage mit dem Vergleichsoperator == fälschlicherweise als FALSE (Typ bool) ausgewertet werden. Daher sollte man in solchen Fällen den Vergleichsoperator === verwenden, mit dem auch der Datentyp geprüft wird.

<?php

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

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

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

?>

Bei der Funktion stristr() spielt die Groß- und Kleinschreibung zwar keine Rolle. Allerdings kann es insbesondere bei der Verwendung der Zeichenkodierung UTF-8 passieren, dass gewisse Kleinbuchstaben nicht zu den Großbuchstaben zugeordnet werden. In solchen Fällen kann man die Multibyte-Funktion mb_stristr() einsetzen. Hierbei kann man die Zeichenkodierung mit angeben, damit z.B. die Groß- und Kleinbuchstaben von Umlauten richtig zugeordnet werden.

<?php

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

// Ausgabe ÄÖÜßäöü
echo mb_stristr($str, $needle, null, 'UTF-8');

?>

Die Funktion stristr() ist ähnlich wie stripos(). Sie unterscheiden sich darin, dass bei stristr() der Rückgabewert die restliche Zeichenkette enthält und bei stripos() lediglich eine numerische Angabe über die Position des gesuchten Teil-Strings.