Start · Sprachen · PHP · Referenz · msgfmt_parse

msgfmt_parse

Funktion

Parst einen formatierten String anhand des Musters eines <code>MessageFormatter</code>-Objekts und gibt ein Array der extrahierten Werte zurück.

seit PHP 5.3.0 Kategorie: string

Signatur

msgfmt_parse(MessageFormatter $formatter, string $string): array|false

Beschreibung

msgfmt_parse ist die prozedurale Variante von MessageFormatter::parse() und kehrt den Formatierungsprozess um: Statt Werte in ein Muster einzusetzen, werden aus einem bereits formatierten String die ursprünglichen Werte extrahiert. Dies ist nützlich, wenn lokalisierte Zeichenketten analysiert oder deserialisiert werden sollen.

Die Funktion nutzt das ICU-Muster (International Components for Unicode), das beim Erstellen des MessageFormatter-Objekts übergeben wurde. Das Muster muss exakt zu dem zu parsenden String passen; die gefundenen Werte werden als numerisch indiziertes Array zurückgegeben, wobei die Reihenfolge den Platzhaltern im Muster entspricht.

Typische Einsatzgebiete sind das Auslesen von Datumsangaben, Zahlen oder anderen lokalisierten Werten aus einem UI-String, z. B. um Benutzereingaben im ICU-Format wieder in typisierte PHP-Werte umzuwandeln.

Schlägt das Parsen fehl – weil der String nicht zum Muster passt –, gibt die Funktion false zurück. Die Fehlerursache lässt sich anschließend über msgfmt_get_error_code und msgfmt_get_error_message ermitteln.

Parameter

Name Typ Default Beschreibung
$formatter Pflicht MessageFormatter Ein MessageFormatter-Objekt, das das ICU-Muster und das Locale enthält, die für den Parse-Vorgang verwendet werden sollen.
$string Pflicht string Der formatierte String, der gemäß dem Muster des Formatters geparst werden soll.

Rückgabewert

Typ
array|false
Beschreibung
Gibt bei Erfolg ein numerisch indiziertes Array zurück, dessen Einträge den durch das Muster definierten Platzhaltern entsprechen. Bei einem Fehler oder wenn der String nicht zum Muster passt, wird false zurückgegeben.

Beispiele

Einfache Zahlen und Text aus einem formatierten String parsen

<?php
// Formatter mit einem ICU-Muster erstellen
$fmt = msgfmt_create('de_DE', 'Preis: {0, number} Euro, Menge: {1, number}');

$input = 'Preis: 12,50 Euro, Menge: 3';

$values = msgfmt_parse($fmt, $input);

if ($values !== false) {
    echo 'Preis: ' . $values[0] . PHP_EOL;
    echo 'Menge: ' . $values[1] . PHP_EOL;
} else {
    echo 'Parsen fehlgeschlagen: ' . msgfmt_get_error_message($fmt) . PHP_EOL;
}
Preis: 12.5 Menge: 3

OOP-Variante: MessageFormatter::parse()

<?php
// Äquivalent zur prozeduralen Variante, aber über die OOP-Schnittstelle
$fmt = new MessageFormatter('en_US', 'On {0, date, short} at {1, time, short}');

$input = 'On 12/31/2024 at 11:59 PM';

$result = $fmt->parse($input);

if ($result !== false) {
    // $result[0] ist ein Unix-Timestamp
    echo 'Datum-Timestamp: ' . $result[0] . PHP_EOL;
    echo 'Zeit-Timestamp:  ' . $result[1] . PHP_EOL;
} else {
    echo 'Fehler: ' . $fmt->getErrorMessage() . PHP_EOL;
}
Datum-Timestamp: 1735689600 Zeit-Timestamp: 86340

// Wichtig · Fallstricke

Locale-Abhängigkeit: Das Parsen ist streng locale-abhängig. Zahlen im deutschen Format (z. B. 1.234,56) werden von einem en_US-Formatter nicht korrekt erkannt und führen zu false. Das Locale muss zum String passen.

Rückgabetypen: Datums-Platzhalter ({0, date}) liefern Unix-Timestamps als Ganzzahlen zurück, keine DateTime-Objekte. Zahlen werden als float oder int zurückgegeben, je nach ICU-Typ.

Fehlerbehandlung: Im Fehlerfall sollte stets msgfmt_get_error_code() und msgfmt_get_error_message() aufgerufen werden, um die Ursache zu diagnostizieren. Ein häufiger Fehler ist eine nicht übereinstimmende Struktur zwischen Muster und Eingabe-String.

Verfügbarkeit: Diese Funktion setzt die PHP-Erweiterung intl voraus, die standardmäßig in PHP ≥ 5.3 verfügbar ist, aber explizit aktiviert sein muss (extension=intl in der php.ini).