PHP: Finde heraus ob ein String ein Wort enthält

Thu, Feb 11, 2021 3 Minuten zum Lesen

Oft steht man vor der Anforderung feststellen zu müssen ob ein bestimmtes Wort in einem gegebenen String vorkommt oder nicht.

Ab PHP Version 8

Seit PHP Version 8 (verfügbar seit dem 26. November 2020) gibt es dazu die praktische Funktion str_contains. Die Überprüfung nimmt dabei auf die Groß- und Kleinschreibung Rücksicht (case-sensitive):

<?php
$string = '6€ auf deine erste Bestellung beim Webhoster netcup mit dem Code WFU4-A79w';

if (str_contains($string, 'netcup')) {
  // Die folgende Codezeile wird ausgeführt.
  echo "Das Wort 'netcup' wurde im String gefunden.\n";
}

if (str_contains($string, 'NETCUP')) {
  // Die folgende Codezeile wird NICHT ausgeführt.
  echo "Das Wort 'NETCUP' wurde im String gefunden.\n";
}
?>

Falls bei der Suche nach dem Wort die Groß- und Kleinschreibung keine Rolle spielen soll, kann man den kompletten String vor der Überprüfung in Großbuchstaben überführen. Dazu verwendet man die Funktion strtoupper:

<?php
$string = '6€ auf deine erste Bestellung beim Webhoster netcup mit dem Code WFU4-A79w';

if (str_contains(strtoupper($string), 'NETCUP')) {
  // Die folgende Codezeile wird ausgeführt.
  echo "Das Wort 'NETCUP' wurde im String gefunden (unabhängig von der Groß- und Kleinschreibung).\n";
}
?>

Die Überlegungen rund um die Einführung der str_contains Funktion kasst du dir übrigens hier durchlesen.

Vor PHP Version 8

Setzt man eine ältere Version von PHP ein muss man auf die strpos oder die stripos Funktion zurückgreifen. Die strpos Funktion beachtet die Groß- und Kleinschreibung des gesuchten Wortes (case-sensitive), während für die Funktion stripos die Groß- und Kleinschreibung keine Rolle spielt (case-insensitive).

<?php
$string = '6€ auf deine erste Bestellung beim Webhoster netcup mit dem Code WFU4-A79w';

if (strpos($string, 'netcup') !== false) {
  // Die folgende Codezeile wird ausgeführt.
  echo "Das Wort 'netcup' wurde im String gefunden.\n";
}

if (strpos($string, 'NETCUP') !== false) {
  // Die folgende Codezeile wird NICHT ausgeführt.
  echo "Das Wort 'NETCUP' wurde im String gefunden.\n";
}
?>

Ganz besonders wichtig ist hier die Verwendung des Vergleichsoperators !==. strpos gibt entweder den Offset zurück an dem es das gesuchte Wort im String gefunden hat. Dabei handelt es sich dann um den Datentyp int. Oder es retourniert den boolschen Datentyp false falls das Wort nicht gefunden wurde.

Verwendet man nun einen anderen Vergleichsoperator als !== führt das auf Grund der automatischen Umwandlung von Datentypen bei PHP unweigerlich zu Problemen (Type Juggling).

Dazu nur ein Beispiel. Angenommen du verwendest != als Vergleichsoperator:

<?php
$string = 'eins zwei';

if (strpos($string, 'eins') != false) {
  // Achtung Fehler! Die folgende Codezeile wird NICHT ausgeführt
  // obwohl das eigentlich der Fall sein sollte.
  echo "Das Wort 'eins' wurde im String gefunden.\n";
}
?>

In diesem Fall gibt strpos den int-Wert 0 zurück. Wieso? Es findet das gesuchte Wort am Offset 0. Der Verlgeichsoperator != führt in dem angeführten Kontext dann aber eine Typumwandlung auf einen boolschen Datentyp durch. Der boolsche Datentyp von 0 ist false. Man sagt auch 0 ist “falsey”. Daher findet unsere Implementierung das Wort “eins” fälschlicherweise nicht im gegebenen String.