如何在 PHP 中将 URL 编码字符串解析为关联数组

9次阅读

如何在 PHP 中将 URL 编码字符串解析为关联数组

本文介绍使用 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 开发中,经常需要处理来自前端、第三方 API 或测试工具(如 Postman)提交的 URL 编码格式数据,例如:

rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%3A33%3A16&sender_id=TESS&receiver_id=SGRQWES

这类字符串本质上是 application/x-www-form-urlencoded 格式,其键值对以 & 分隔、= 连接,且值通常经过 urlencode() 处理(空格 → %20,冒号 → %3A 等)。PHP 提供了专为此场景设计的函数:parse_str()

✅ 正确用法:解析为关联数组

parse_str() 的核心优势在于——它会自动解码 URL 编码(即执行等效于 urldecode() 的操作),并支持直接输出到指定数组变量,避免污染当前作用域

<?php $queryString = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%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 )

? 注意:即使原始字符串中 rq_datetime 的空格和冒号被编码为 %20 和 %3A,parse_str() 也会自动还原为可读格式,无需手动调用 urldecode()。

⚠️ 关键注意事项

  • 不推荐省略第二个参数:若仅写 parse_str($str) 而不传入数组变量,函数会将键名作为变量名在当前作用域创建变量(如 $rq_uuid),这易引发命名冲突与安全风险,应始终显式传入目标数组
  • 输入需为合法查询字符串格式:确保字符串不含开头的 ?(如 ?rq_uuid=…),否则需先 ltrim($str, ‘?’);也建议在解析前做基础校验(如非空、含 =)。
  • 不处理嵌套结构或数组语法:parse_str() 仅支持扁平键值对(如 a=1&b=2),不原生支持 a[]=1&a[]=2 或 a[b]=1 等复杂格式(如需,可配合正则或专用库如 http_build_query() 反向逻辑处理)。
  • 字符编码兼容性:默认按当前脚本编码(通常是 UTF-8)解码;若源数据为其他编码(如 GBK),需先转换编码再解析。

? 实用封装示例(增强健壮性)

<?php function queryStringToArray(string $query): array {     if (empty(trim($query))) {         return [];     }      // 移除可能的前导 '?' 并清理空白符     $cleanQuery = ltrim(trim($query), '?');      $result = [];     parse_str($cleanQuery, $result);      return $result; }  // 使用示例 $input = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%3A33%3A16&sender_id=TESS'; $params = queryStringToArray($input); var_dump($params); ?>

✅ 总结

parse_str($string, $array) 是 PHP 解析 URL 编码查询字符串最标准、最轻量、最可靠的方式。它集解码、分割、赋值于一体,语义清晰、性能优异。在接收 Postman 测试请求、解析回调参数、处理 Webhook payload 等场景中,应优先选用该函数,并始终通过第二个参数接收结果,以保障代码的可维护性与安全性。

text=ZqhQzanResources