Abschnitt 3 · Lektion 5
Mit Text arbeiten
Text kommt selten in der Form an, in der du ihn brauchst. Da hängen Leerzeichen dran, die Groß- und Kleinschreibung passt nicht, eine Zeile enthält drei Angaben auf einmal. Diese Lektion sammelt die Funktionen, mit denen du das geradebiegst.
Vorweg eine Eigenheit, die dir sofort auffallen wird: In PHP sind das alles Funktionen mit einem
Präfix, keine Methoden. Es heißt strlen($text) und nicht $text.length(). Und die
Argumentreihenfolge ist nicht einheitlich: Bei str_contains kommt erst der Heuhaufen und dann die
Nadel, bei str_replace erst das Gesuchte und dann der Text. Das ist historisch gewachsen und lässt
sich nicht wegdiskutieren. Schlag im Handbuch nach, statt es auswendig zu lernen. Selbst Leute,
die seit fünfzehn Jahren PHP schreiben, tun genau das.
Messen und säubern
<?php
$eingabe = " Mia Berg ";
echo "Roh: [", $eingabe, "]\n";
echo "Getrimmt: [", trim($eingabe), "]\n";
echo "Laenge roh: ", strlen($eingabe), "\n";
echo "Laenge getrimmt: ", strlen(trim($eingabe)), "\n";
$stadt = "Köln";
echo "Köln in Bytes: ", strlen($stadt), "\n";
echo "Köln in Zeichen: ", mb_strlen($stadt), "\n"; trim entfernt Leerzeichen, Tabulatoren und Zeilenumbrüche am Anfang und am Ende. Das brauchst du
bei praktisch jeder Eingabe, die von außen kommt, denn irgendwer hat immer ein Leerzeichen hinter
seinen Namen getippt. Es gibt auch ltrim und rtrim, wenn nur eine Seite gemeint ist.
strlen sagt dir die Länge. Die eckigen Klammern in der Ausgabe stehen im Beispiel nur da, damit du
siehst, wo der Text anfängt und aufhört, das ist ein alter Trick beim Suchen.
Und dann die Sache mit Köln: vier Zeichen, fünf Bytes. Du kennst sie aus Lektion 2.2 und hast in
3.4 gesehen, was sie mit einer Tabelle anstellt. Die Regel bleibt: Überall, wo ein Mensch das
Ergebnis sieht, nimmst du die mb_-Fassung.
Suchen, ersetzen, herausschneiden
<?php
$titel = "Kaffee aus Kolumbien";
var_dump(str_contains($titel, "Kolumbien"));
var_dump(str_starts_with($titel, "Kaffee"));
echo str_replace("Kolumbien", "Brasilien", $titel), "\n";
echo substr($titel, 0, 6), "\n";
echo mb_substr("Köln am Rhein", 0, 4), "\n";
echo substr("Köln am Rhein", 0, 4), "\n"; str_contains beantwortet die Frage „kommt das darin vor” mit true oder false. Dazu gibt es
str_starts_with und str_ends_with für Anfang und Ende. Alle drei kamen erst mit PHP 8, und alle
drei ersparen dir eine Zeile, die vorher jeder falsch geschrieben hat.
str_replace tauscht aus, und zwar jedes Vorkommen, nicht nur das erste. Das ist meistens
gewollt und einmal im Jahr eine böse Überraschung.
substr schneidet einen Ausschnitt heraus: ab welcher Stelle, wie viele. Und hier lauert wieder die
Byte-Zählung. Die letzten beiden Zeilen im Beispiel holen jeweils die ersten vier Einheiten aus
Köln am Rhein. mb_substr gibt Köln, substr gibt Köl, weil das ö schon zwei der vier
Bytes verbraucht hat. Bei einer ungünstigeren Stelle bekommst du ein halbes Zeichen und in der
Ausgabe ein Fragezeichen.
Groß und klein
<?php
$name = "Straße";
echo strtoupper($name), "\n";
echo mb_strtoupper($name), "\n";
echo strtolower("KÖLN"), "\n";
echo mb_strtolower("KÖLN"), "\n"; strtolower und strtoupper sind der Klassiker, um zwei Eingaben vergleichbar zu machen. Bei
deutschen Wörtern versagen sie aber sichtbar: Straße wird zu STRAßE, weil strtoupper das ß
nicht kennt, und KÖLN wird zu kÖln, weil das Ö unberührt bleibt.
mb_strtoupper macht aus dem ß ein SS, mb_strtolower aus dem Ö ein ö. Wenn du also
irgendwo in einer Anmeldung E-Mail-Adressen kleinschreibst oder zwei Namen vergleichst, nimm die
mb_-Fassung. Sonst gelten Köln und KÖLN bei dir als zwei verschiedene Städte.
Zerlegen und zusammensetzen
<?php
$zeile = "Kaffee;2;4.90";
$teile = explode(";", $zeile);
echo "Erster Teil: ", $teile[0], "\n";
echo "Zweiter Teil: ", $teile[1], "\n";
echo "Dritter Teil: ", $teile[2], "\n";
echo implode(" | ", $teile), "\n"; explode zerschneidet einen Text an einem Trennzeichen, implode klebt die Teile wieder zusammen.
Die beiden sind ein Paar und begegnen dir überall: eine CSV-Zeile, eine Liste von Schlagworten, ein
Pfad, eine Adresse.
Was explode zurückgibt, ist eine Liste, und an die einzelnen Teile kommst du über ihre Nummer
in eckigen Klammern, beginnend bei null. Listen sind das Thema von Abschnitt 5, hier leihst du dir
nur diesen einen Handgriff. Mehr brauchst du für die Aufgabe nicht.
Ein Hinweis für später, damit er dich nicht kalt erwischt: Wenn der Text weniger Teile hat als erwartet, gibt es die höheren Nummern nicht, und der Zugriff darauf ist eine Warnung. In Abschnitt 11 kommt genau dieser Fall bei echten Eingaben wieder, dort mit einer Prüfung davor.
Zum Mitnehmen
PHP hat für Text keine Methoden, sondern ein paar Dutzend Funktionen mit uneinheitlicher Argumentreihenfolge. Zehn davon brauchst du täglich, den Rest schlägst du nach, und das ist keine Schwäche, sondern der ehrliche Umgang damit.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.