核心PHP中URL含空格的参数键被转为下划线的解决方案咨询
解决PHP查询字符串键中空格被转为下划线的问题
PHP默认会将查询字符串中包含空格、点号等特殊字符的参数键自动替换为下划线,导致$_GET/$_REQUEST无法保留原始键名。要解决这个问题,你需要直接解析原始的查询字符串,绕过PHP的自动处理机制。
方案:手动解析$_SERVER['QUERY_STRING']
$_SERVER['QUERY_STRING']存储了未被PHP处理的原始查询字符串,我们可以手动拆分、解码其中的键值对,完整保留原始键名。
基础版代码(处理普通参数)
<?php $rawParams = []; // 获取原始查询字符串 $queryString = $_SERVER['QUERY_STRING']; // 拆分每个参数 $params = explode('&', $queryString); foreach ($params as $param) { // 仅拆分一次键和值,避免值中包含=符号导致错误 list($key, $value) = explode('=', $param, 2); // 解码键和值,还原原始空格 $rawParams[urldecode($key)] = urldecode($value); } print_r($rawParams); ?>
访问http://localhost/user.php?A%20String=wqe%20qwe后,输出结果会是:
Array ( [A String] => wqe qwe )
进阶版代码(处理重复参数)
如果存在重复参数(如?A%20String=1&A%20String=2),可以修改代码将重复值存入数组:
<?php $rawParams = []; $queryString = $_SERVER['QUERY_STRING']; $params = explode('&', $queryString); foreach ($params as $param) { list($key, $value) = explode('=', $param, 2); $decodedKey = urldecode($key); $decodedValue = urldecode($value); if (isset($rawParams[$decodedKey])) { // 若键已存在,转为数组存储多个值 if (!is_array($rawParams[$decodedKey])) { $rawParams[$decodedKey] = [$rawParams[$decodedKey]]; } $rawParams[$decodedKey][] = $decodedValue; } else { $rawParams[$decodedKey] = $decodedValue; } } print_r($rawParams); ?>
原理说明
PHP的变量解析规则会自动将参数键中的非字母、数字、下划线字符替换为下划线,这是$_GET/$_REQUEST无法保留空格键名的根本原因。通过直接解析原始查询字符串,我们可以完全控制键值对的解码和存储逻辑,避免这种自动替换。
内容的提问来源于stack exchange,提问作者Atul Sharma
相关产品推荐
相关产品推荐

