Warum Anfang und Ende von Strings in PHP prüfen?
\n\nStell dir vor: Du entwickelst eine Website mit PHP und musst prüfen, ob ein Dateiname auf .jpg endet? Oder ob eine E-Mail mit admin beginnt? Früher waren dafür umständliche Konstrukte mit substr() oder regulären Ausdrücken nötig. Seit PHP 8.0 gibt es jedoch eine elegante Lösung – die Funktionen str_starts_with() und str_ends_with().
Das ist nicht nur syntaktischer Zucker. Es sind schnelle, lesbare und sichere Methoden zur String-Verarbeitung, die jeder PHP-Entwickler kennen sollte. In diesem Artikel zeigen wir dir anhand praktischer Beispiele, wie sie funktionieren, vergleichen sie mit alten Ansätzen und helfen dir, typische Fehler zu vermeiden.
\n\nWas sind str_starts_with und str_ends_with?
\n\nBeide Funktionen wurden mit PHP 8.0 (veröffentlicht im November 2020) eingeführt. Sie lösen eine einfache Aufgabe: Prüfen, ob ein String einen bestimmten Präfix (Anfang) oder Suffix (Ende) enthält.
\n\nFunktionssignaturen
\n\nstr_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool\n\n- \n
$haystack– der String, in dem gesucht wird (der Heuhaufen). \n $needle– der Teilstring, nach dem gesucht wird (die Nadel). \n - Rückgabe:
trueoderfalse. \n
Einfaches Beispiel
\n\necho str_starts_with('Hallo, Welt!', 'Hallo'); // true\necho str_ends_with('Hallo, Welt!', 'Welt!'); // true\necho str_starts_with('Hallo, Welt!', 'Welt'); // false\n\nWichtig: Die Funktionen unterscheiden zwischen Groß- und Kleinschreibung. str_starts_with('PHP', 'php') gibt false zurück. Für eine case-insensitive Prüfung solltest du strtolower() oder strtoupper() auf beide Strings anwenden.
Praktische Anwendungsbeispiele
\n\n1. Dateiendung prüfen
\n\n$dateiname = 'bericht_2024.pdf';\n\nif (str_ends_with($dateiname, '.pdf')) {\n echo "Das ist ein PDF-Dokument";\n} elseif (str_ends_with($dateiname, '.jpg')) {\n echo "Das ist ein Bild";\n} else {\n echo "Unbekanntes Format";\n}\n\nFrüher wurde dies mit substr($dateiname, -4) gelöst – leicht, sich bei der Suffix-Länge zu vertun. Jetzt liest sich der Code wie normales Englisch: „Der String endet mit“.
2. URL- oder E-Mail-Validierung
\n\n$email = 'benutzer@gmail.com';\n$url = 'https://pythonlib.de';\n\nif (str_ends_with($email, '@gmail.com')) {\n echo "Gmail-Benutzer";\n}\n\nif (str_starts_with($url, 'https://')) {\n echo "Sichere Verbindung";\n}\n\n3. Array von Strings filtern
\n\n$dateien = ['bild.jpg', 'dokument.pdf', 'foto.png', 'notizen.txt'];\n\n$bilder = array_filter($dateien, function($datei) {\n return str_ends_with($datei, '.jpg') || str_ends_with($datei, '.png');\n});\n\nprint_r($bilder); // ['bild.jpg', 'foto.png']\n\nWie es früher funktionierte (und warum die neuen Funktionen besser sind)
\n\nVor PHP 8.0 nutzten Entwickler verschiedene Ansätze. Vergleichen wir sie mit den neuen Funktionen.
\n\nMethode 1: substr()
\n\n// Alter Weg: Anfang prüfen\nif (substr($string, 0, strlen('präfix')) === 'präfix') { ... }\n\n// Neuer Weg\nif (str_starts_with($string, 'präfix')) { ... }\n\nNachteile des alten Wegs:
\n- \n
- Umständlich: Die Länge des Teilstrings muss berechnet werden. \n
- Fehleranfällig bei negativer Länge (wenn
$needlelänger ist als$haystack). \n - Weniger lesbarer Code. \n
Methode 2: strpos()
\n\n// Alter Weg: Anfang prüfen\nif (strpos($string, 'präfix') === 0) { ... }\n\n// Neuer Weg\nif (str_starts_with($string, 'präfix')) { ... }\n\nMit strpos kann leicht ein logischer Fehler passieren: Wenn du nicht === 0 setzt, sondern nur == false oder == 0 verwendest, kann das zu unerwarteten Ergebnissen führen.