PHP获取URL GET参数时参数值内&被截断丢失如何解决
问题成因
- GET参数的标准分隔符为
&,Web服务端解析查询字符串时,会优先将&识别为不同参数的分割边界,不会将其判定为参数值的组成部分。 - 你当前URL中参数值内的
&仅做了HTML实体编码为&,该编码规则仅适用于HTML文档渲染场景,对URL解析逻辑无效,PHP仍然会把&开头的&识别为参数分隔符,因此clss_type的取值到&位置就被截断,最终只能拿到Boys。
解决方法
方案1:生成URL时对参数值做URL编码(推荐)
拼接URL前对所有参数值使用PHP原生的urlencode()函数做URL编码,编码后参数值中的&会被转换为%26,不会被识别为参数分隔符:
<?php $type = 'Boys & Girls'; // 生成的URL为 page.php?clss_type=Boys%2B%26%2BGirls $url = 'page.php?clss_type=' . urlencode($type); // 接收端直接取值即可拿到完整内容 $class = $_GET['clss_type']; echo $class; // 输出 Boys & Girls ?>
方案2:手动解析原始查询字符串(兼容场景)
如果无法调整URL生成逻辑,可以直接读取原始未解析的查询字符串手动提取参数:
<?php // 读取原始查询字符串 $rawQuery = $_SERVER['QUERY_STRING']; // 正则匹配提取clss_type的完整值 if (preg_match('/clss_type=([^&]*)/', $rawQuery, $res)) { $class = urldecode($res[1]); // 处理值中的HTML实体 $class = html_entity_decode($class); echo $class; // 输出 Boys & Girls } ?>
内容的提问来源于stack exchange,提问作者Mohamed Saeed Ahmed
相关产品推荐
相关产品推荐

