parse_str()
Artikel über die PHP-Funktion parse_str(), die einen Query-String in Variablen umwandelt – nützlich für URLs und Formulare.
Die PHP-Funktion parse_str() parst einen URL-Query-String (den Teil nach dem ? in einer URL, z. B. name=John&age=35) und wandelt jedes key=value-Paar in einen Eintrag in einem Array um. Sie ist das Gegenstück zu http_build_query(): Eine Funktion erstellt einen Query-String, die andere zerlegt ihn.
Diese Seite behandelt die Syntax der Funktion, ein einfaches Beispiel, den Umgang mit Arrays und verschachtelten Schlüsseln, URL-Dekodierungsregeln sowie einen wichtigen Sicherheitshinweis zum zweiten Argument.
Syntax
parse_str(string $string, array &$result): voidparse_str() nimmt zwei Parameter entgegen:
$string— der zu parsende Query-String, zum Beispielname=John&age=35.&$result— eine Variable, die per Referenz übergeben wird und die die Funktion mit den geparsten Schlüssel/Wert-Paaren füllt. Sie wird bei jedem Aufruf mit einem neuen Array überschrieben.
Die Funktion gibt nichts zurück (void); die geparsten Daten werden in $result geschrieben.
Hinweis: In älteren PHP-Versionen war das Argument $result optional, und das Weglassen importierte jedes Paar direkt in lokale Variablen. Dieses Verhalten wurde in PHP 7.2 als veraltet markiert und in PHP 8.0 entfernt — $result ist jetzt erforderlich. Immer angeben.
Einfaches Beispiel
Hier enthält $query einen Query-String. parse_str() teilt ihn an &, dekodiert jeden Wert und speichert das Ergebnis in $output. Die Ausgabe lautet:
Array
(
[name] => John Doe
[age] => 35
[gender] => male
)Beachten Sie, dass John+Doe zu John Doe wurde: parse_str() wendet dieselbe URL-Dekodierung wie urldecode() an, d. h. ein + wird zu einem Leerzeichen und %XX-Escape-Sequenzen werden aufgelöst.
Arrays und verschachtelte Schlüssel parsen
Query-Strings verwenden oft [], um Arrays auszudrücken – genau wie HTML-Formularfelder namens colors[] oder user[name]. parse_str() versteht diese Klammernotation und erstellt automatisch verschachtelte Arrays:
<?php
$query = 'colors[]=red&colors[]=blue&user[name]=Sam&user[age]=20';
parse_str($query, $output);
print_r($output);
?>Ausgabe:
Array
(
[colors] => Array
(
[0] => red
[1] => blue
)
[user] => Array
(
[name] => Sam
[age] => 20
)
)Dies ist das gleiche Parsing, das PHP auf $_GET und $_POST anwendet, weshalb ein Formularfeld namens user[name] als $_POST['user']['name'] ankommt.
Den Query-String aus einer URL auslesen
Ein häufiges Muster ist, den Query-String mit parse_url() aus einer vollständigen URL zu extrahieren und ihn dann an parse_str() zu übergeben:
<?php
$url = 'https://example.com/search?term=php&page=2';
parse_str(parse_url($url, PHP_URL_QUERY), $params);
print_r($params);
?>Ausgabe:
Array
(
[term] => php
[page] => 2
)Für den Query-String der aktuellen Anfrage benötigt man parse_str() in der Regel gar nicht — PHP hat $_GET bereits befüllt. Verwenden Sie parse_str(), wenn der Query-String von woanders kommt: einer gespeicherten URL, einer API-Antwort oder einem Webhook-Payload.
Sicherheitshinweis
Wenn das zweite Argument das Ergebnis-Array ist (wie oben gezeigt), ist parse_str() sicher und vorhersehbar. Die Gefahr bestand nur bei der inzwischen entfernten Ein-Argument-Form, die Variablen direkt in den lokalen Gültigkeitsbereich injizierte — nicht vertrauenswürdige Eingaben konnten vorhandene Variablen überschreiben (eine Variante des alten register_globals-Problems). Da PHP 8.0 diese Form entfernt hat, ist dieses Problem in modernem Code verschwunden. Dennoch sollten Sie jeden Wert, der aus einem Query-String stammt, als nicht vertrauenswürdige Benutzereingabe behandeln und vor der Verwendung validieren.
Verwandte Funktionen
explode()— einen String an einem Trennzeichen aufteilen, wenn eine flache Liste stattkey=value-Parsing benötigt wird.implode()— Array-Elemente wieder zu einem String zusammenfügen.str_getcsv()— CSV-formatierte Strings in Arrays parsen.- PHP-Formularverarbeitung — wie
$_GETund$_POSTdasselbe Parsing verwenden.