PHP String Contains Word: So funktioniert's unter der Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Die Frage, die jeden PHP-Entwickler quält

\n\n

Stell dir vor: Du programmierst in PHP und musst prüfen, ob ein String ein bestimmtes Wort enthält. Klingt einfach, oder? Doch ein Blick auf Stack Overflow zeigt: Diese Frage hat tausende Aufrufe und dutzende Antworten. Viele verheddern sich in strpos, nutzen preg_match, wo eine einfache Funktion reicht, und tappen in Fallen mit Groß-/Kleinschreibung und Kodierungen. Heute geben wir nicht nur eine fertige Lösung – wir schauen unter die Haube von PHP und analysieren, wie diese Funktionen wirklich arbeiten. Bereit? Los geht's!

\n\n

Der Klassiker: strpos und seine Tücken

\n\n

Die beliebteste Antwort auf Stack Overflow ist die Nutzung von strpos. Diese eingebaute PHP-Funktion sucht die Position des ersten Vorkommens eines Teilstrings. Aber es gibt einen Haken: Anfänger schreiben oft so:

\n\n
$string = "Hallo, Welt!";\n$word = "Welt";\nif (strpos($string, $word)) {\n    echo "Wort gefunden!";\n} else {\n    echo "Wort nicht gefunden!";\n}\n
\n\n

Das funktioniert ... bis das Wort am Anfang des Strings steht. Warum? Weil strpos eine Position (Zahl) zurückgibt. Steht das Wort an Position 0, wird 0 in PHP als false in der if-Bedingung interpretiert. Die korrekte Variante:

\n\n
if (strpos($string, $word) !== false) {\n    echo "Wort gefunden!";\n}\n
\n\n

Wie funktioniert strpos unter der Haube?

\n\n

Wenn du strpos aufrufst, verwendet PHP intern einen Algorithmus zur Teilstring-Suche. In modernen PHP-Versionen (7.x und 8.x) kommt ein optimierter Algorithmus zum Einsatz, der auf dem Boyer-Moore-Horspool-Algorithmus basiert. Statt Zeichen einzeln durchzugehen, nutzt er eine "Bad-Character"-Tabelle, um ganze Textblöcke zu überspringen, wenn ein Zeichen des Suchworts nicht passt. Das macht die Suche extrem schnell, besonders bei langen Strings.

\n\n

Es gibt jedoch eine Einschränkung: strpos unterscheidet zwischen Groß- und Kleinschreibung. "Welt" und "welt" sind für ihn unterschiedliche Wörter. Für eine case-insensitive Prüfung nutzt du stripos – die Variante, die die Groß-/Kleinschreibung ignoriert.

\n\n

Der moderne Weg: str_contains (PHP 8.0+)

\n\n

Seit PHP 8.0 gibt es die lang ersehnte Funktion str_contains. Sie löst das Problem mit strpos ein für alle Mal. Statt die Position zu prüfen, gibt sie direkt true oder false zurück:

\n\n
$string = "Hallo, Welt!";\n$word = "Welt";\nif (str_contains($string, $word)) {\n    echo "Wort gefunden!";\n}\n
\n\n

Was steckt in str_contains?

\n\n

Unter der Haube ist str_contains ein Wrapper um strpos. Es ruft dieselbe interne Suchfunktion auf, wandelt das Ergebnis aber automatisch in einen Boolean um. Das macht den Code sauberer und sicherer. Arbeitest du jedoch mit älteren PHP-Versionen (7.4 und älter), steht dir str_contains nicht zur Verfügung – dann musst du weiterhin strpos mit der Prüfung !== false verwenden.

\n\n

Das Power-Tool: Reguläre Ausdrücke mit preg_match

\n\n

Manchmal reicht es nicht, nur ein Wort zu prüfen – du brauchst eine ganze Wortgruppe oder ein Muster. Hier kommt preg_match ins Spiel. Reguläre Ausdrücke geben dir Superkräfte: Du kannst nach ganzen Wörtern suchen (damit "Welt" nicht mit "Weltall" verwechselt wird), die Groß-/Kleinschreibung ignorieren, Wortgrenzen erkennen und vieles mehr.

\n\n
$string = "Hallo, Weltall!";\n$word = "Welt";\nif (preg_match("/\\b" . preg_quote($word, '/') . "\\b/ui", $string)) {\n    echo "Wort gefunden!";\n} else {\n    echo "Wort nicht gefunden!";\n}\n
\n\n

Hier steht \\b für eine Wortgrenze, das Flag u aktiviert die Unicode-Unterstützung (damit auch Umlaute wie ä, ö, ü korrekt funktionieren). Das Flag i macht die Suche case-insensitiv. Die Funktion preg_quote maskiert Sonderzeichen, falls das Suchwort welche enthält.

Blogs

Buchempfehlungen