strpos($haystack, $needle) liefert die Position des ersten $needle in $haystack, ab 0 gezählt, oder false, wenn es nicht vorkommt. Prüfe das Ergebnis immer mit !== false, denn ein Treffer am Anfang liefert 0.
Wenn du unter PHP 8 nur eine Ja-oder-Nein-Antwort brauchst, ist str_contains() klarer. Verwende strpos(), wenn die Position zählt.
Syntax
strpos(string $haystack, string $needle, int $offset = 0): int|false
Die Suche unterscheidet Groß- und Kleinschreibung. $offset gibt an, wo die Suche beginnt; ein negativer Offset zählt vom Ende des Strings.
Die Falle !== false
0 und false sind beim lockeren Vergleich (==) gleich. Ein Treffer an Position 0 wird deshalb von jeder nicht strikten Prüfung als „nicht gefunden“ behandelt.
Dieselbe Regel gilt für stripos(), strrpos() und array_search(), die alle für einen echten Treffer 0 liefern können.
Suche ohne Groß- und Kleinschreibung mit stripos
stripos() nimmt dieselben Argumente und ignoriert die Schreibweise von ASCII-Buchstaben.
Das letzte Vorkommen mit strrpos finden
strrpos() liefert die Position des letzten Treffers. Das ist der Standardweg, eine Dateiendung oder das letzte Segment eines Pfads zu holen.
Speziell für Dateinamen erledigt pathinfo($file, PATHINFO_EXTENSION) das für dich. Wie man den String an der Position schneidet, steht auf der Seite zu substr().
Die Suche an einem Offset beginnen
Das dritte Argument überspringt den Anfang des Strings. Ein negativer Offset beginnt so viele Zeichen vor dem Ende.
Alle Vorkommen finden
strpos() findet einen Treffer. Iteriere und schiebe den Offset hinter jeden Treffer, um alle zu finden:
Nur die Anzahl? substr_count($text, 'the') ist kürzer. Für Muster liefert preg_match_all() mit PREG_OFFSET_CAPTURE jeden Treffer mit seiner Position.
Japanischer Text: Byte-Position vs Zeichenposition
strpos() findet Multibyte-Text korrekt, aber die Zahl, die es liefert, ist in Bytes. Kana und gängige Kanji brauchen in UTF-8 je 3 Bytes, also ist in rein japanischem Text die Byte-Position das Dreifache der Zeichenposition, und in gemischtem Text laufen die beiden auf weniger offensichtliche Weise auseinander. mb_strpos() liefert Zeichen, und das erwartet mb_substr().
Die beiden zu mischen ist ein klassischer Bug: Ein Ergebnis von strpos() an mb_substr() zu übergeben, beginnt zu weit hinten im String. Verwende strpos mit substr und mb_strpos mit mb_substr.
Häufig gestellte Fragen
Was liefert strpos() in PHP?
Die Position des ersten Treffers als Ganzzahl, ab 0 gezählt, oder false, wenn der gesuchte String nicht gefunden wird. strpos('hello', 'l') liefert 2.
Warum brauche ich !== false bei strpos()?
Weil ein Treffer ganz am Anfang 0 liefert, und 0 == false ist wahr. if (strpos($s, 'a')) behandelt einen Treffer an Position 0 als „nicht gefunden“. Vergleiche immer mit strpos($s, 'a') !== false.
Was ist der Unterschied zwischen strpos, stripos und strrpos?
strpos() findet den ersten Treffer und unterscheidet Groß- und Kleinschreibung. stripos() findet den ersten Treffer ohne Rücksicht auf die Schreibweise. strrpos() findet den letzten Treffer. strripos() findet den letzten Treffer ohne Rücksicht auf die Schreibweise.
Sollte ich strpos oder str_contains verwenden, um zu prüfen, ob ein String Text enthält?
Unter PHP 8 verwendest du str_contains($haystack, $needle), das ein einfaches true oder false liefert und keine Falle mit Position 0 hat. Verwende strpos(), wenn du die Position selbst brauchst.
Wie verwende ich strpos mit japanischem Text?
strpos() findet japanischen Text korrekt, liefert aber eine Byte-Position. Wenn du die Position an mb_substr() übergibst oder einem Nutzer zeigst, verwendest du mb_strpos(), das die Position in Zeichen liefert.