Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

PHP sscanf() - Die umfassende Anleitung zum Parsen von Strings

Sie befinden sich: Home > Php Tutorial > String in ein angegebenes...

String in ein angegebenes Format übertragen


Eintrag am:  14.08.2010
Hits / Besucher:  4556
Sprache:  Deutsch
Kategorie:  Fortgeschrittene...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

In der Programmierung begegnen dir häufig Situationen, in denen du bestimmte Informationen aus langen Zeichenketten herauslesen musst. Besonders beim Verarbeiten von Benutzereingaben oder Daten aus externen Quellen ist es wichtig, Text systematisch und zuverlässig zu analysieren. Die PHP-Funktion sscanf() ist dafür ein mächtiges Werkzeug.

Titelbild mit PHP-Logo, Code-Schnipseln, Trichter und Text: PHP sscanf() Strings clever zerlegen und auslesen

Einführung: String-Parsen mit sscanf()

Die PHP-Funktion sscanf() gehört zu den vielseitigsten Werkzeugen, wenn es darum geht, strukturierte Informationen aus Strings auszulesen und direkt Variablen zuzuweisen. Sie ist das „Input-Gegenstück“ zu sprintf(): Während sprintf() Werte formatiert in einen String schreibt, liest sscanf() formatierte Werte aus einem String heraus.

Warum und wann sscanf() verwenden?

Vorteile:

  • Einfachheit: Bei klar strukturierten Eingaben entfällt aufwendiges Parsen.
  • Direkte Zuweisung: Extrahierte Werte landen sofort in Variablen.
  • Typsicherheit: Werte werden direkt als Integer, Float oder String interpretiert.

Typische Anwendungsfälle:

  • Logzeilen-Analyse (z.B. "[2025-05-19 16:00] ERROR: Datei nicht gefunden")
  • Aufteilung von Benutzernamen, Datum, Zahlen aus Formularen oder Textdateien
  • Datenimport aus anderen Anwendungen mit festen Formaten
  • Versionsnummern zerlegen (z.B. "v3.12.4")

Was du in diesem Guide lernst

  • Grundlagen, fortgeschrittene Techniken und häufige Fehlerquellen
  • Scansets als mächtiges Feature für flexibles Parsen
  • Praxisvergleiche zu Alternativen wie preg_match() oder explode()

sscanf() Grundlagen: Syntax und Parameter

Bevor du mit sscanf() arbeitest, solltest du die Syntax und die Parameter genau kennen.

Syntax im Detail

<?php

/*
* sscanf(string $sText, string $sFormat, mixed &...$mVariablen)
*
* @param string $sText Der zu analysierende String
* @param string $sFormat Das Format-Muster
* @param mixed &$mVariablen Optionale Referenz-Variablen
* @return array|int|null
*/
sscanf(string $sText, string $sFormat, mixed &...$mVariablen): array|int|null;

Parameter-Analyse

1. $sText: Der Quell-String, aus dem Werte extrahiert werden sollen. Beispiele: "123 abc", "17.11.2025 18:22"

2. $sFormat: Bestimmt, wie die Werte im String gefunden und interpretiert werden. Literalzeichen (z.B. Trennstriche, Leerzeichen) müssen im String genauso vorkommen. Format-Spezifizierer geben an, wie die Werte gelesen werden. Beispiel: "%d %s" liest eine Zahl gefolgt von einem Wort, getrennt durch Whitespace.

3. &$mVariablen: Optionale Variablen, die du per Referenz übergibst. Werden direkt befüllt.

  • Keine Variablen: sscanf() gibt ein Array mit den gefundenen Werten zurück.
  • Mit Variablen: sscanf() gibt die Anzahl der erfolgreich zugewiesenen Werte zurück (int).

Der Format-String: Das Herzstück von sscanf()

Der Format-String definiert, welche Bestandteile aus dem Quell-String extrahiert werden sollen und in welchem Typ sie erwartet werden.

Die wichtigsten Typ-Spezifizierer

Die Wahl des passenden Typ-Spezifizierers entscheidet darüber, wie die Funktion einzelne Datenfragmente aus dem Text interpretiert und weitergibt.

SpezifiziererBeschreibungBeispiel
%dVorzeichenbehaftete Dezimalzahl"42", "-7"
%uVorzeichenlose Dezimalzahl"99"
%fFließkommazahl"3.141", "-0.5"
%sZeichenkette (bis Whitespace)"Max", "Mustermann"
%cEinzelnes Zeichen"M"
%x, %XHexadezimalzahl"2A" (42 in Dezimal)
%oOktalzahl"077"
%iIntelligente Ganzzahl (Basis auto)"42", "0x2A", "052"
%nAnzahl der verarbeiteten Zeichen(zählt, keine Extraktion)
%%Ein Prozentzeichen"%"

Praktisches Beispiel:

<?php

$sText = "42 Max";
sscanf($sText, "%d %s", $iNummer, $sName);
/* $iNummer = 42, $sName = "Max" */

Scansets: Flexibles Parsen mit %[...]

Scansets sind das mächtigste Feature von sscanf() und fehlen in vielen Tutorials. Während %s nur bis zum nächsten Whitespace liest, kannst du mit Scansets genau definieren, welche Zeichen gelesen werden dürfen:

<?php

/* Alles bis zum Komma lesen */
$sText = "Max Mustermann, 42 Jahre";
sscanf($sText, "%[^,], %d Jahre", $sName, $iAlter);
/* $sName = "Max Mustermann", $iAlter = 42 */

/* Nur Kleinbuchstaben lesen */
$sText = "hello123WORLD";
sscanf($sText, "%[a-z]%d%[A-Z]", $sKlein, $iZahl, $sGross);
/* $sKlein = "hello", $iZahl = 123, $sGross = "WORLD" */

/* E-Mail-Teile trennen */
$sMail = "info@beispiel.de";
sscanf($sMail, "%[^@]@%s", $sUser, $sDomain);
/* $sUser = "info", $sDomain = "beispiel.de" */

Das ^-Zeichen innerhalb der eckigen Klammern negiert die Zeichenauswahl: %[^,] liest alles außer Kommas. Ohne Scansets wäre es nicht möglich, Strings mit Leerzeichen sinnvoll zu parsen, da %s bei Whitespace stoppt.

Modifikatoren für präzisere Kontrolle

Zuweisungsunterdrückung (*): Mit %*s wird ein Wert übersprungen:

<?php

$sText = "Max Mustermann";
sscanf($sText, "%*s %s", $sNachname);
/* $sNachname = "Mustermann" */

Breitenangabe: Limitiert die Anzahl gelesener Zeichen:

<?php

$sText = "ABC123";
sscanf($sText, "%3s%d", $sTeil1, $iTeil2);
// $sTeil1 = "ABC", $iTeil2 = 123

Unterschiede zu sprintf()-Formaten

  • Nicht unterstützt: F, g, G, b
  • Immer Punkt als Dezimaltrennzeichen (kein Komma)
  • Keine Locale-Sensitivität

Schnellreferenz: Format-Spezifizierer

FormatBeschreibungBeispielErgebnis
%dZahl"42"42
%3s3 Zeichen als String"abc""abc"
%*sString überspringen"foo bar""bar"
%fFloat"3.14"3.14
%cEinzelnes Zeichen"X""X"
%[^,]Alles bis zum Komma"Max, 42""Max"
%nAnzahl Zeichen"12345"5 (so viele verarbeitet)

Rückgabewerte und Fehlerbehandlung

Die Art des Rückgabewerts bestimmt, wie du mit den extrahierten Informationen im weiteren Programmablauf arbeiten kannst.

Was sscanf() zurückgibt

  • Mit Variablen: Anzahl der erfolgreich zugewiesenen Werte (int).
  • Ohne Variablen: Array mit den geparsten Werten (array).

Beispiel mit Variablen:

<?php

$sText = "99 Luftballons";
$iGefunden = sscanf($sText, "%d %s", $iAnzahl, $sWort);
/* $iGefunden = 2, $iAnzahl = 99, $sWort = "Luftballons" */

Beispiel ohne Variablen:

<?php

$sText = "25 Apfel";
$aGefunden = sscanf($sText, "%d %s");
/* $aGefunden = [25, "Apfel"] */

Robuste Fehlerbehandlung mit Code

Die Empfehlung „Immer Rückgabewert prüfen“ ist als Tipp allein nicht hilfreich. Hier ein konkretes Pattern für robustes Parsen:

<?php

$sZeile = "2025-05-19 ERROR: Datei nicht gefunden";

$iGefunden = sscanf(
$sZeile,
"%d-%d-%d %[^:]: %[^\n]",
$iJahr, $iMonat, $iTag, $sLevel, $sNachricht
);

if ($iGefunden === 5) {
echo "Datum: $iJahr-$iMonat-$iTag";
echo "Level: $sLevel, Nachricht: $sNachricht";
} elseif ($iGefunden > 0) {
echo "Teilweise geparst: nur $iGefunden von 5 Feldern";
} else {
echo "Format passt nicht zum String";
}

Verhalten bei Teilmatches

Was passiert, wenn der String nicht vollständig zum Format passt? sscanf() gibt nur die Anzahl der tatsächlich zugewiesenen Werte zurück. Nicht zugewiesene Variablen bleiben null:

<?php

$sText = "42";

/* Erwartet: Zahl + String, vorhanden: nur Zahl */
$aResult = sscanf($sText, "%d %s");
var_dump($aResult);
/* array(2) { [0]=> int(42) [1]=> NULL } */

/* Mit Variablen: */
$iGefunden = sscanf($sText, "%d %s", $iZahl, $sWort);
/* $iGefunden = 1, $iZahl = 42, $sWort = null */

sscanf() in der Praxis

Einsteiger beginnen am besten mit einfachen Beispielen, um das Prinzip des Parsens und die Wirkung verschiedener Platzhalter praktisch zu verstehen.

Grundlegende Beispiele

Zahlen extrahieren:

<?php

$sText = "Bestellung 123 enthält 5 Artikel";
sscanf($sText, "Bestellung %d enthält %d Artikel", $iBestellnr, $iArtikel);
/* $iBestellnr = 123, $iArtikel = 5 */

Namen splitten:

<?php

$sText = "Max Mustermann";
sscanf($sText, "%s %s", $sVorname, $sNachname);
/* $sVorname = "Max", $sNachname = "Mustermann" */

Datum parsen:

<?php

$sText = "Januar 01 2023";
sscanf($sText, "%s %d %d", $sMonat, $iTag, $iJahr);
/* $sMonat = "Januar", $iTag = 1, $iJahr = 2023 */

Beispiele mittlerer Komplexität

Fester Präfix und Suffix:

<?php

$sText = "SN/0042-X";
sscanf($sText, "SN/%d-%c", $iNummer, $sBuchstabe);
/* $iNummer = 42, $sBuchstabe = "X" */

Verschiedene Datentypen kombiniert:

<?php

$sText = "User: 17 Alter: 28";
sscanf($sText, "User: %d Alter: %d", $iId, $iAlter);
/* $iId = 17, $iAlter = 28 */

Log-Zeile mit Datum:

<?php

$sText = "2025-05-19 Fehler: 404";
sscanf($sText, "%d-%d-%d Fehler: %d", $iJahr, $iMonat, $iTag, $iFehler);
/* $iJahr = 2025, $iMonat = 5, $iTag = 19, $iFehler = 404 */

Fortgeschrittene Szenarien

Versionsnummer zerlegen:

<?php

$sVersion = "v3.12.4";
sscanf($sVersion, "v%d.%d.%d", $iMajor, $iMinor, $iPatch);
/* $iMajor = 3, $iMinor = 12, $iPatch = 4 */

Hex-Farbwert in RGB zerlegen:

<?php

$sFarbe = "#FF8800";
sscanf($sFarbe, "#%2x%2x%2x", $iRot, $iGruen, $iBlau);
/* $iRot = 255, $iGruen = 136, $iBlau = 0 */

Apache-Log-Zeile parsen:

<?php

$sLog = '192.168.1.1 GET /index.php 200';
sscanf($sLog, "%s %s %s %d", $sIp, $sMethode, $sPfad, $iStatus);
/* $sIp = "192.168.1.1", $sMethode = "GET" */
/* $sPfad = "/index.php", $iStatus = 200 */

Variable Leerzeichen: Ein Whitespace im Format matcht beliebig viele Whitespace-Zeichen im String:

<?php

$sText = "42 Max";
sscanf($sText, "%d %s", $iZahl, $sName);
/* Funktioniert, da beliebig viele Whitespaces erlaubt */

Optionale Teile: sscanf() kann keine wirklich optionalen Felder abdecken. In solchen Fällen ist oft ein regulärer Ausdruck (preg_match()) besser geeignet.

fscanf(): Dateien zeilenweise parsen

Die verwandte Funktion fscanf() funktioniert genau wie sscanf(), liest aber direkt aus einem Datei-Stream statt aus einem String. Das ist ideal, wenn du eine strukturierte Textdatei zeilenweise verarbeiten willst:

<?php

/* Konfigurationsdatei: server.conf
* db_host 127.0.0.1
* db_port 3306
* db_name shop
*/
$rDatei = fopen('server.conf', 'r');
$aConfig = [];

while ($aZeile = fscanf($rDatei, "%s %s")) {
$aConfig[$aZeile[0]] = $aZeile[1];
}

fclose($rDatei);
/* $aConfig = ["db_host" => "127.0.0.1", ...] */

Als Alternative kannst du auch fgets() verwenden und die Zeile anschließend mit sscanf() parsen. fscanf() kombiniert beide Schritte in einem Aufruf.

Best Practices und Fallstricke

Auch erfahrene Entwickler laufen beim Parsen von Zeichenketten schnell in typische Stolperfallen, die sich mit dem richtigen Wissen gezielt umgehen lassen.

Häufige Fehler

  1. Vergessene Referenz (&): Die Variablen müssen per Referenz übergeben werden.
  2. %s stoppt bei Whitespace: Wenn du Strings mit Leerzeichen lesen willst, nutze Scansets (%[^,] oder %[^\n]).
  3. Strukturannahmen: Der Format-String muss exakt zur String-Struktur passen.
  4. Dezimaltrennzeichen: sscanf() erwartet immer den Punkt als Dezimaltrennzeichen, unabhängig von der Server-Locale. Wenn ein Benutzer "3,14" statt "3.14" eingibt, wird %f nur 3 lesen und beim Komma stoppen.

Tipps für lesbare Format-Strings

  • Kommentiere komplexe Formate im Code
  • Kombiniere mehrere sscanf()-Aufrufe, wenn ein Format zu komplex wird
  • Prüfe immer den Rückgabewert, um Teilmatches zu erkennen

Performance

sscanf() ist sehr schnell für strukturierte, einfache Daten. Bei großen Datenmengen (z.B. 100.000 Zeilen in Schleifen) liefert es ähnliche Performance wie explode(). Reguläre Ausdrücke sind aufwendiger, dafür aber flexibler.

Alternativen und Entscheidungshilfe

Nicht jede Parsing-Aufgabe braucht sscanf(). Je nach Situation gibt es bessere Werkzeuge.

preg_match() und preg_match_all()

Stärken: Komplexe Muster, optionale Gruppen, flexible Logik.
Schwächen: Aufwendiger, schwerer zu lesen.

<?php

$sText = "ID: 234, Name: Lisa";

/* Mit sscanf() */
sscanf($sText, "ID: %d, Name: %s", $iId, $sName);

/* Mit preg_match() */
preg_match('/ID: (\d+), Name: (\w+)/', $sText, $aTreffer);

explode()

Ideal bei festen Trennzeichen, wenn du keine Typumwandlung brauchst:

<?php

$sText = "Apfel,Banane,Orange";
$aFruechte = explode(",", $sText);
/* ["Apfel", "Banane", "Orange"] */

str_getcsv()

Speziell für CSV-Daten mit Anführungszeichen:

<?php

$sText = '"Max","Mustermann",42';
$aWerte = str_getcsv($sText);
/* ["Max", "Mustermann", "42"] */

Wann welche Funktion?

SituationBeste WahlWarum
Festes Format bekannt (Log, Version)sscanf()Direkt, typensicher, schnell
Einfaches Trennzeichen (Komma, Pipe)explode()Einfacher, kein Format nötig
CSV mit Anführungszeichenstr_getcsv()Behandelt Escaping korrekt
Komplexe, variable Musterpreg_match()Flexibler, optionale Gruppen
JSON-Datenjson_decode()Spezialisiert für JSON
Datei zeilenweise parsenfscanf()Wie sscanf(), direkt aus Datei

Verwandte Funktionen

Neben sscanf() gibt es weitere Funktionen, die beim String-Parsen und -Formatieren helfen:

FunktionAufgabeBesonderheit
fscanf()Parsen aus Datei-StreamWie sscanf(), aber mit Dateihandle
sprintf()String zusammenbauenGegenstück zu sscanf(), formatiert
printf()Formatiert direkt ausgebenWie sprintf(), aber mit echo

FAQ: Häufig gestellte Fragen

Hier findest du Antworten auf die häufigsten Fragen rund um sscanf().

Kann sscanf() Strings mit Leerzeichen lesen?
Ja, mit Scansets. %s stoppt bei Whitespace, aber %[^,] oder %[^\n] liest alles bis zum angegebenen Trennzeichen bzw. Zeilenende:

<?php

$sText = "Max Mustermann, Berlin";
sscanf($sText, "%[^,], %[^\n]", $sName, $sStadt);
/* $sName = "Max Mustermann", $sStadt = "Berlin" */

Was passiert bei einem deutschen Komma als Dezimaltrennzeichen?
sscanf() erwartet immer den Punkt. Bei "3,14" liest %f nur 3 und stoppt beim Komma. Ersetze das Komma vorher: str_replace(',', '.', $sText).

Wie viele Werte kann sscanf() maximal extrahieren?
Es gibt kein festes Limit. Du kannst so viele Format-Spezifizierer verwenden, wie du benötigst. In der Praxis werden Formate mit mehr als 6-8 Feldern aber schwer lesbar.

Ist sscanf() sicher für Benutzereingaben?
sscanf() parst lediglich Strings. Es führt keinen Code aus und ist daher sicher. Du solltest aber trotzdem die extrahierten Werte validieren, bevor du sie in SQL-Queries oder Ausgaben verwendest.

Wann ist preg_match() die bessere Wahl?
Wenn das Format nicht fest ist, optionale Teile enthält oder du benannte Gruppen brauchst. sscanf() ist ideal für strikt strukturierte Strings, preg_match() für variable Muster.

Kann ich sscanf() mit Dateien verwenden?
Nicht direkt. Verwende dafür fscanf(), das die gleiche Syntax hat, aber aus einem Datei-Handle liest.

Fazit

Mit sscanf() parst du klar strukturierte Strings besonders elegant, sicher und performant. Bei eindeutigem Aufbau (z.B. Logzeilen, IDs, Versionsnummern) gibt es kaum eine schnellere Alternative. Dank Scansets (%[^,]) kannst du auch Strings mit Leerzeichen zuverlässig zerlegen. Nutze die Stärken von sscanf() und kombiniere sie bei Bedarf mit regulären Ausdrücken oder explode(), wenn die Struktur komplexer wird.

Experimentiere mit Format-Strings, kommentiere deine Formate und prüfe den Rückgabewert, dann vermeidest du typische Fehler und profitierst maximal von diesem unterschätzten PHP-Tool.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.