parse_str() 是 PHP 內置的強大函數,專門用於將 URL 查詢字符串或類似格式的字符串解析為變量或關聯數組。它能自動處理 URL 編碼、多值字段、特殊字符等邊界情況,是處理表單數據、API 參數、URL 路由的利器。
parse_str(string $string, array &$result = null): void
"a=1&b=2")<?php
$str = "id=23&name=John%20Adams&tags=php&tags=web";
$output = [];
parse_str($str, $output);
print_r($output);
/* 輸出:
Array
(
[id] => 23
[name] => John Adams
[tags] => Array
(
[0] => php
[1] => web
)
)
*/
<?php
parse_str("id=23&name=John%20Adams");
// $id = 23; $name = "John Adams"; 直接注入當前作用域
// 風險:覆蓋現有變量、注入惡意鍵名(如 _GET、_POST)
<?php
$callbackStr = "1&errid=1&fee=2&balance=2582&fails=&msgid=634541149212681528&msg=全部發送成功。";
$params = [];
parse_str($callbackStr, $params);
echo "消息ID: {$params['msgid']}\n"; // 634541149212681528
echo "狀態碼: {$params['errid']}\n"; // 1
echo "餘額: {$params['balance']}\n"; // 2582
函數會自動對值進行 urldecode(),%20 變空格,%E4%B8%AD%E6%96%87 變中文,無需手動處理。
如 tags=php&tags=web 會生成 ['tags' => ['php', 'web']],這對多選框、標簽系統極其友好。
PHP 5.4+ 已移除此特性,但舊項目需注意:若開啟,解析前值會經 addslashes() 轉義,需配合 stripslashes() 使用。
PHP 會將非法字符(如空格、點號、方括號外的特殊符號)轉換為下劃線:
parse_str("user.name=john", $arr);
// $arr['user_name'] = 'john' // 點號被替換
| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 解析 $_SERVER['QUERY_STRING'] | parse_str($_SERVER['QUERY_STRING']) | parse_str($_SERVER['QUERY_STRING'], $params) |
| 合併多個查詢字符串 | parse_str($a . '&' . $b) | parse_str($a, $arr); parse_str($b, $arr); |
| 處理 JSON POST 數據 | parse_str(file_get_contents('php://input')) | json_decode(file_get_contents('php://input'), true) |
function myParseStr(string $str, array &$result = []): void {
$pairs = explode('&', $str);
foreach ($pairs as $pair) {
[$key, $value] = array_pad(explode('=', $pair, 2), 2, '');
$key = urldecode($key);
$value = urldecode($value);
// 處理同名鍵轉數組邏輯...
$result[$key] = $value;
}
}
urldecode()http_build_query() 可實現數組↔查詢字符串無損雙向轉換parse_str() 雖小,卻是 PHP Web 開發中處理參數的基石工具,掌握其特性能讓參數解析代碼更簡潔、更健壯。