sscanf()
Die PHP-Funktion sscanf() liest einen String und extrahiert Werte anhand eines Formats – die Umkehrfunktion von sprintf().
Die PHP-Funktion sscanf() liest einen String und extrahiert Werte gemäß einem angegebenen Format – sie ist die Umkehrung von sprintf(). Während sprintf() einen formatierten String aus Variablen aufbaut, zerlegt sscanf() einen formatierten String wieder in einzelne Variablen. Sie ist besonders nützlich, wenn Text in einer vorhersehbaren Form vorliegt (Datumsangaben, Koordinaten, Log-Zeilen, ID-Codes) und man saubere, typisierte Einzelteile erhalten möchte, ohne einen regulären Ausdruck schreiben zu müssen.
Dieses Kapitel behandelt die Syntax, die zwei Möglichkeiten zur Ergebnisübernahme, die gebräuchlichen Format-Spezifizierer und häufige Fallstricke.
Syntax
sscanf(string $string, string $format, mixed &...$vars): array|int|null$string— der zu parsende Eingabetext.$format— eine Vorlage, die beschreibt, was gelesen werden soll, mit%-Spezifizierern (dieselbe Familie, dieprintfverwendet).&...$vars— optionale Variablen, die per Referenz übergeben werden und die geparsten Werte aufnehmen.
Das Verhalten von sscanf() hängt davon ab, ob diese zusätzlichen Variablen übergeben werden:
| Aufrufstil | Rückgabewert |
|---|---|
Nur $string und $format | Ein Array der geparsten Werte |
Mit Referenzvariablen nach $format | Ein int: Anzahl der erfolgreich zugewiesenen Werte |
Werte als Array zurückgeben
Werden keine Referenzargumente übergeben, gibt sscanf() alle Werte als Array zurück. Dies ist der sauberste Stil in modernem PHP und vermeidet das Übergeben von Variablen per Referenz.
%s liest das nächste Wort ohne Leerzeichen (John) und %d liest eine Ganzzahl (25, als echter int gespeichert, nicht als String "25"). Die Ausgabe ist:
John
25Direkt in Variablen zuweisen
Werden Variablen nach dem Format übergeben, erfolgt die Zuweisung direkt in diese Variablen. In diesem Modus ist der Rückgabewert die Anzahl der übereinstimmenden Felder, was zur Eingabevalidierung praktisch ist.
<?php
$input = 'John 25';
$matched = sscanf($input, '%s %d', $name, $age);
echo $matched . "\n"; // 2 (both fields were read)
echo $name . "\n"; // John
echo $age; // 25
?>Hinweis: In PHP 8 wurde das
&-Präfix zur Aufrufzeit (z. B.sscanf($s, $f, &$name)) entfernt. Die Variable wird einfach ohne Prefix übergeben –sscanf()deklariert diese Parameter selbst als Referenz.
Häufige Format-Spezifizierer
| Spezifizierer | Liest |
|---|---|
%s | Einen String bis zum nächsten Leerzeichen |
%d | Eine vorzeichenbehaftete Dezimalzahl |
%f | Eine Gleitkommazahl |
%x | Eine hexadezimale Ganzzahl |
%c | Ein einzelnes Zeichen |
%% | Ein literales %-Zeichen |
Literale Zeichen im Format (Leerzeichen, Schrägstriche, Doppelpunkte) müssen auch in der Eingabe vorhanden sein. Dies macht sscanf() hervorragend für Daten mit festem Format, wie z. B. Datumsangaben:
<?php
$date = '2026-06-21';
[$year, $month, $day] = sscanf($date, '%d-%d-%d');
printf("Year=%d Month=%d Day=%d", $year, $month, $day);
// Year=2026 Month=6 Day=21
?>Wann sscanf() gegenüber Alternativen verwenden
- Verwende
sscanf(), wenn das Format fest und einfach ist und du typisierte Ergebnisse in einer Zeile möchtest. - Verwende
explode(), wenn du nur an einem Trennzeichen aufteilen und alles als Strings behalten möchtest. - Verwende
preg_match(), wenn die Struktur unregelmäßig ist oder Validierungsregeln benötigt, die über einfache Feldtypen hinausgehen. - Um das Umgekehrte zu tun – einen formatierten String zusammenzustellen – verwende
sprintf()oderprintf().
Um formatierte Eingaben direkt aus einer Datei statt aus einem String zu lesen, sieh dir fscanf() an, das auf die gleiche Weise Zeile für Zeile arbeitet.
Fallstricke
%sstoppt bei Leerzeichen. Ein mehrteiliger Wert wird nicht erfasst. Um den Rest einer Zeile zu lesen, verwende eine Zeichenmenge wie%[^\n].- Ein nicht übereinstimmendes Feld bricht den Rest ab. Wenn
%derwartet wird, die Eingabe aber Buchstaben enthält, stoppt das Parsen; der zurückgegebene Zählwert ermöglicht die Erkennung. - Nicht übereinstimmende nachfolgende Variablen werden
null. Prüfe immer den zurückgegebenen Zählwert, bevor du späteren Variablen vertraust.