Prüfen des Zeichenkettenanfangs in PHP: Alle Methoden und Fallstricke

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

„Beginnt mein String mit diesem Wort?“ – Die ewige Frage des PHP-Entwicklers

\n\n

Stellen Sie sich vor: Sie schreiben einen URL-Parser, verarbeiten eingehende Anfragen oder filtern einfach eine Dateiliste. Und dann steht die Aufgabe an – Sie müssen prüfen, ob ein String mit einer bestimmten Zeichenfolge beginnt. Das scheint doch einfach, oder? Weit gefehlt. Bis vor kurzem gab es in PHP keine eingebaute Funktion für diese grundlegende Operation. Entwickler behalfen sich mit allen möglichen Tricks: Manche schnitten den String mit substr() zurecht, andere suchten die Position mit strpos(), und wieder andere stiegen in die Tiefen der regulären Ausdrücke ein.

\n\n

In diesem Artikel ordnen wir alle Methoden zur Prüfung des Zeichenkettenanfangs in PHP systematisch ein. Sie erfahren nicht nur, wie man es „stilvoll“ in modernen Versionen macht, sondern auch, wie man die Aufgabe in „Legacy“-Projekten löst, in denen PHP 5 noch im Einsatz ist. Los geht’s!

\n\n

Der korrekteste Weg: str_starts_with() (PHP 8.0+)

\n\n

Wenn Ihr Projekt auf PHP 8.0 oder neuer läuft – Sie haben Glück. Ihnen steht die native Funktion str_starts_with() zur Verfügung, die genau das tut, was auf dem Etikett steht. Sie akzeptiert zwei Argumente: den ursprünglichen String und die Teilzeichenkette, die wir am Anfang suchen. Sie gibt true oder false zurück.

\n\n
<?php\n$url = "https://pythonlib.ru/php-tutorial";\n\nif (str_starts_with($url, "https://")) {\n    echo "Link ist sicher, verwende HTTPS";\n} else {\n    echo "Achtung! Keine HTTPS-Verbindung";\n}\n// Gibt aus: Link ist sicher, verwende HTTPS\n?>
\n\n

Warum ist das die beste Option?

\n
    \n
  • Lesbarkeit – Der Code spricht für sich selbst. Sie müssen nicht kommentieren, was diese Zeile tut.
  • \n
  • Leistung – Die Funktion ist auf C-Ebene von PHP optimiert. Sie arbeitet schneller als manuelle Prüfungen.
  • \n
  • Sicherheit – Keine Probleme mit Multibyte-Kodierungen (es sei denn, Sie arbeiten auf besondere Weise mit UTF-8, aber dazu später mehr).
  • \n
\n\n

Übrigens hat die Funktion eine „Zwillingsschwester“ – str_ends_with(), die das Ende eines Strings prüft. Aber das ist ein Thema für einen separaten Artikel.

\n\n

Der Klassiker: strpos()

\n\n

Vor dem Erscheinen von str_starts_with() war die Verwendung der Funktion strpos() die beliebteste Methode. Sie sucht das erste Vorkommen einer Teilzeichenkette in einem String und gibt dessen Position (Zahl) zurück. Wenn die Teilzeichenkette nicht gefunden wird, gibt sie false zurück.

\n\n

Der Trick besteht darin: Wenn die Teilzeichenkette ganz am Anfang steht, ist ihre Position gleich 0. Und 0 ist in PHP ein falsy-Wert. Daher muss die Prüfung strikt sein:

\n\n
<?php\n$string = "Hallo, Welt!";\n\nif (strpos($string, "Hallo") === 0) {\n    echo "String beginnt mit Hallo";\n} else {\n    echo "Nein, der Anfang ist anders";\n}\n?>
\n\n

Wichtig! Verwenden Sie immer den strikten Vergleichsoperator ===, nicht ==. Warum? Stellen Sie sich vor, Sie suchen nach einer Teilzeichenkette, die nicht existiert. strpos() gibt false zurück. Wenn Sie strpos($string, "test") == 0 schreiben, dann ergibt false == 0 true (weil PHP Typen umwandelt). Und Ihr Code würde sagen, dass der String mit "test" beginnt, obwohl das nicht stimmt. Eine klassische Falle für Anfänger!

\n\n

Vor- und Nachteile von strpos()

\n
    \n
  • ✅ Funktioniert in allen PHP-Versionen ab 4.
  • \n
  • ✅ Keine Installation von Erweiterungen erforderlich.
  • \n
  • ❌ Code ist weniger lesbar – man muss sich an den strikten Vergleich erinnern.
  • \n
  • ❌ Bei falscher Verwendung (ohne ===) führt es zu schwer auffindbaren Fehlern.
  • \n
\n\n

Die Methode der alten Schule: substr()

\n\n

Eine weitere Methode, die aus den Tiefen der Geschichte zu uns kam. Die Idee ist einfach: Aus dem String ein Stück mit der gleichen Länge wie die gesuchte Teilzeichenkette ausschneiden und vergleichen.

\n\n
<?php\n$filename = "bericht_2024.pdf";\n\n$prefix = "bericht_";\nif (substr($filename, 0, strlen($prefix)) === $prefix) {\n    echo "Dies ist ein Bericht für 2024";\n} else {\n    echo "Kein Bericht";\n}\n?>
\n\n

Wichtig! Auch hier ist der strikte Vergleich === entscheidend. substr() gibt immer einen String zurück (oder false im Fehlerfall), aber der Vergleich mit == kann zu unerwarteten Ergebnissen führen, wenn die Teilzeichenkette beispielsweise aus Zahlen besteht.

\n\n

Vor- und Nachteile von substr()

\n
    \n
  • ✅ Funktioniert in allen PHP-Versionen.
  • \n
  • ✅ Der Code ist intuitiv verständlich.
  • \n
  • ❌ Erfordert die Berechnung der Länge mit strlen() – ein zusätzlicher Schritt.
  • \n
  • ❌ Bei Multibyte-Kodierungen (UTF-8) kann substr() Zeichen „zerreißen“, wenn die Teilzeichenkette mehr als ein Byte pro Zeichen verwendet. Verwenden Sie in diesem Fall mb_substr().
  • \n
\n\n

Die schwere Art: Reguläre Ausdrücke (preg_match)

\n\n

Manchmal sieht man Code, in dem preg_match() verwendet wird, um den Anfang eines Strings zu prüfen. Das ist, als würde man mit einem Vorschlaghammer eine Nuss knacken – es funktioniert, aber es ist übertrieben.

\n\n
<?php\n$string = "Hallo, Welt!";\n\nif (preg_match("/^Hallo/", $string)) {\n    echo "String beginnt mit Hallo";\n}\n?>
\n\n

Das Caret-Symbol ^ im regulären Ausdruck bedeutet „Anfang der Zeile“. Wenn Sie also /^Hallo/ schreiben, suchen Sie nach „Hallo“ genau am Anfang des Strings.

\n\n

Wann ist das sinnvoll?

\n
    \n
  • Wenn Sie nicht nur den Anfang prüfen, sondern auch andere Bedingungen (z. B. „beginnt mit einer Ziffer“ oder „beginnt mit einem Buchstaben von A bis Z“).
  • \n
  • Wenn Sie mit komplexen Mustern arbeiten, die mit einfachen Funktionen nicht umsetzbar sind.
  • \n
\n\n

Wann ist das nicht sinnvoll?

\n
    \n
  • ✅ Für eine einfache Prüfung auf eine statische Teilzeichenkette ist das zu viel des Guten. str_starts_with() oder strpos() sind schneller und lesbarer.
  • \n
  • ✅ Reguläre Ausdrücke sind ressourcenintensiver. Bei vielen Prüfungen (z. B. in einer Schleife) spüren Sie den Leistungsunterschied.
  • \n
\n\n

Multibyte-Zeichenketten: Die UTF-8-Falle

\n\n

Alle oben genannten Methoden (außer str_starts_with() in PHP 8.0+) arbeiten standardmäßig byteweise. Das bedeutet, dass sie bei Zeichenketten in UTF-8-Kodierung (oder anderen Multibyte-Kodierungen) falsche Ergebnisse liefern können.

\n\n

Beispiel: Der String „München“ enthält den Buchstaben „ü“, der in UTF-8 zwei Bytes belegt. Wenn Sie prüfen, ob der String mit „Mün“ beginnt, funktioniert substr() möglicherweise nicht richtig, da er Bytes und nicht Zeichen zählt.

\n\n

Für solche Fälle gibt es das mb_*-Erweiterungspaket (Multibyte String). Die entsprechenden Funktionen heißen:

\n
    \n
  • mb_substr() – zum Ausschneiden von Teilzeichenketten unter Berücksichtigung der Kodierung.
  • \n
  • mb_strpos() – zum Suchen der Position einer Teilzeichenkette unter Berücksichtigung der Kodierung.
  • \n
\n\n

Beispiel mit mb_substr():

\n\n
<?php\n$string = "München ist schön";\n$prefix = "Mün";\n\nif (mb_substr($string, 0, mb_strlen($prefix, "UTF-8"), "UTF-8") === $prefix) {\n    echo "String beginnt mit Mün";\n}\n?>
\n\n

Beachten Sie: str_starts_with() in PHP 8.0+ verarbeitet Multibyte-Zeichenketten korrekt, wenn die Kodierung des Projekts richtig konfiguriert ist. Aber in Legacy-Code müssen Sie vorsichtig sein.

\n\n

Vergleichstabelle der Methoden

\n\n

Um Ihnen die Wahl zu erleichtern, habe ich eine kleine Tabelle zusammengestellt:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MethodePHP-VersionLesbarkeitLeistungUTF-8
str_starts_with()8.0+⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
strpos() === 04+⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ (mit mb_strpos)
substr()4+⭐⭐⭐⭐⭐⭐⭐⭐⭐ (mit mb_substr)
preg_match()4+⭐⭐⭐⭐⭐⭐⭐⭐ (mit u-Modifikator)
\n\n

Fazit: Was soll man wählen?

\n\n

Die Antwort ist einfach: Wenn Sie PHP 8.0 oder neuer verwenden, verwenden Sie str_starts_with(). Das ist der moderne, lesbare und schnelle Weg. Wenn Sie aus irgendeinem Grund an einer älteren Version festhalten (es kommt vor, Legacy ist Legacy), dann verwenden Sie strpos() mit striktem Vergleich === 0. Das ist die zuverlässigste und schnellste Alternative.

\n\n

Vermeiden Sie substr() für diese Aufgabe – es ist unnötig umständlich. Und verwenden Sie reguläre Ausdrücke nur, wenn Sie wirklich komplexe Muster benötigen.

\n\n

Vergessen Sie nicht die Multibyte-Kodierungen! Wenn Ihre Anwendung mit UTF-8 arbeitet (und das tut sie heutzutage wahrscheinlich), testen Sie Ihren Code mit Zeichen wie „é“, „ü“ oder „ñ“. Es ist besser, jetzt einen Fehler zu finden, als später in der Produktion.

\n\n

Viel Erfolg beim Programmieren! Mögen Ihre Strings immer mit dem beginnen, was Sie erwarten.

Blogs

Buchempfehlungen