
本文介绍使用 php 内置函数 parse_str() 将标准 url 查询字符串(如 postman 发送的 raw form-data 或 x-www-form-urlencoded 数据)高效、安全地转换为键值对关联数组的方法,并涵盖编码处理、空格与特殊字符注意事项及最佳实践。
本文介绍使用 php 内置函数 parse_str() 将标准 url 查询字符串(如 postman 发送的 raw form-data 或 x-www-form-urlencoded 数据)高效、安全地转换为键值对关联数组的方法,并涵盖编码处理、空格与特殊字符注意事项及最佳实践。
在 PHP 开发中,经常需要处理来自外部系统(如 Postman、前端表单或第三方 API)传递的 URL 编码格式字符串,例如:
rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09+16%3A33%3A16&sender_id=TESS&receiver_id=SGRQWES
这类字符串符合 application/x-www-form-urlencoded 格式,其键值对以 & 分隔,参数值经 urlencode() 编码(空格转 + 或 %20,冒号转 %3A 等)。PHP 提供了专为此场景设计的函数 —— parse_str()。
✅ 正确用法:解析到目标数组
parse_str() 的推荐用法是显式传入第二个参数(引用数组),避免污染当前作用域变量(旧式用法会自动创建同名变量,存在安全隐患和命名冲突风险):
<?php $queryString = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09+16%3A33%3A16&sender_id=TESS&receiver_id=SGRQWES'; parse_str($queryString, $params); print_r($params); ?>
输出结果为标准关联数组:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[rq_uuid] => e53473de-0483-44f5-91f0-2be74e58c277
[rq_datetime] => 2022-03-09 16:33:16
[sender_id] => TESS
[receiver_id] => SGRQWES
)? 注意:parse_str() 自动解码 URL 编码(如 %20 → 空格,%3A → :),无需手动调用 urldecode();但要求输入字符串格式规范(键值对由 = 连接,多组由 & 连接)。
⚠️ 关键注意事项
- 不支持原始 + 号作为字面量:若业务中需传输实际加号(+),应确保发送端使用 %2B 编码,因为 parse_str() 默认将 + 视为空格。
- 无内置过滤/验证:parse_str() 仅做解析,不校验数据类型或安全性。生产环境务必对 $params 中关键字段(如 rq_uuid)进行 filter_var() 或正则校验。
- 避免空值覆盖:若 $params 已存在同名键,parse_str() 会直接覆盖。建议初始化为空数组:$params = []; parse_str($str, $params);
- PHP 8.1+ 兼容性:该函数完全兼容,且在严格模式下仍稳定可靠。
✅ 推荐增强写法(健壮性提升)
<?php
function queryStringToArray(string $query): array
{
$result = [];
// 移除首尾空白,防止解析异常
$cleanQuery = trim($query);
if (empty($cleanQuery)) {
return $result;
}
parse_str($cleanQuery, $result);
return $result;
}
// 使用示例
$input = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09+16%3A33%3A16&sender_id=TESS';
$params = queryStringToArray($input);
var_dump($params);
?>总结
parse_str($string, $array) 是 PHP 解析 URL 编码查询字符串的标准、高效且安全的首选方案。它原生支持 UTF-8、自动解码、零依赖,适用于 API 请求解析、日志回放、测试数据构造等场景。牢记始终使用双参数形式、校验输入合法性、并对输出数据做业务级过滤,即可稳健集成到各类项目中。











