str_contains, str_starts_with, str_ends_with – Schluss mit strpos !== false
Enthält dieser Text das Wort? Fängt die Datei mit https an? Das ging jahrelang nur über strpos und einen Vergleich, den man leicht falsch schreibt. Seit PHP 8 gibt es drei Funktionen, die genau das sagen, was sie tun.
Ich habe diese Zeile über Jahre geschrieben und jedes Mal kurz nachgedacht:
if (strpos($text, 'rechnung') !== false) { … }Warum !== false und nicht einfach if (strpos(...))? Weil strpos die Position zurückgibt — und wenn das gesuchte Wort ganz am Anfang steht, ist diese Position 0. Und 0 ist in PHP „falsch". Der naive Code hätte also genau den offensichtlichsten Fall übersehen.
Seit PHP 8 braucht man diesen Denkschritt nicht mehr:
if (str_contains($text, 'rechnung')) { … }Liest sich wie ein deutscher Satz und liefert einen echten true/false-Wert. Kein Vergleich, keine Falle.
Die drei Funktionen
str_contains('Rechnung 2026-014.pdf', '2026'); // true
str_starts_with('https://bymw.de', 'https://'); // true
str_ends_with('bericht.pdf', '.pdf'); // trueAlle drei arbeiten groß-/kleinschreibungssensitiv. Wenn das stört, senkst du vorher beide Seiten ab:
str_contains(mb_strtolower($betreff), mb_strtolower($suchwort));mb_strtolower statt strtolower, weil deutsche Umlaute sonst nicht sauber umgewandelt werden.
Wo mir das im Alltag begegnet
Dateiendungen prüfen:
if (!str_ends_with(strtolower($name), '.webp')) {
throw new RuntimeException('Nur WebP-Dateien erlaubt.');
}Wichtig: Das ist eine Bequemlichkeitsprüfung, keine Sicherheitsprüfung. Der wahre Typ einer hochgeladenen Datei steckt in ihrem Inhalt, nicht im Namen — dafür brauchst du finfo. Die Endung prüfe ich trotzdem, weil sie 99 % der versehentlich falschen Dateien schon vorher abfängt.
Externe Links erkennen:
$extern = str_starts_with($url, 'http://') || str_starts_with($url, 'https://');Ein Präfix sauber abschneiden:
if (str_starts_with($pfad, $basis)) {
$rest = substr($pfad, strlen($basis));
}Die Kombination str_starts_with + substr ersetzt bei mir jedes preg_replace('~^…~', '', …), das ich früher dafür genommen habe. Kein regulärer Ausdruck, nichts zu escapen, und beim Lesen sofort klar.
Und wenn ich doch die Position brauche?
Dann ist strpos weiterhin das richtige Werkzeug — aber eben nur dann. Die Faustregel, die ich mir angewöhnt habe:
- **Will ich wissen, ob?** →
str_contains/str_starts_with/str_ends_with - **Will ich wissen, wo?** →
strpos(mit!== false)
Das ist eine der kleinsten Verbesserungen aus PHP 8 und trotzdem eine, die ich täglich nutze. Guter Code ist selten clever — er ist meistens nur eindeutig.
Du pflegst ein älteres PHP-Projekt und bist unsicher, was sich beim Umstieg auf PHP 8 lohnt? Frag mich, ich sortiere dir das gern ehrlich nach Aufwand und Nutzen.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
First-Class-Callable-Syntax in PHP: aus strlen(...) wird ein echter Wert
Funktionen als Zeichenketten weiterzureichen – 'strlen', [$objekt, 'methode'] – hat nie jemand gemocht: kein Tippfehlerschutz, keine Sprungmarke in der IDE. Seit PHP 8.1 schreibst du drei Punkte und bekommst ein Closure-Objekt.
array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
Schöne Zeilenumbrüche in CSS – text-wrap balance und pretty
Eine Überschrift, bei der ein einzelnes Wort einsam in der letzten Zeile hängt, sieht unruhig aus. Mit text-wrap balance und pretty überlässt du dem Browser das saubere Umbrechen – ohne manuelle <br> und ohne JavaScript.