Simple PHP中带&的字符串在URL参数中被意外编码如何解决?
问题原因
你遇到的是HTML实体自动解析问题,并不是字符串被编码为ASCII:
¤是标准HTML实体,对应字符¤,你输出¤cy时,浏览器会优先匹配前缀¤做实体解析,剩余未匹配的cy直接拼接,最终显示为¤cy- 同理
ð是对应字符ð的HTML实体,所以ðnic会被解析为ðnic
该问题通常出现在将URL查询参数直接输出到HTML页面(比如a标签href属性、页面文本)的场景。
修复方案
优先推荐:使用PHP原生函数处理
不要手动拼接参数,直接用http_build_query,它会自动处理参数的URL编码和分隔符规则,完全避免拼接错误:
// 直接生成符合HTTP规范的查询字符串 $param = http_build_query($pars);
如果需要把生成的查询字符串拼接到HTML的href等属性中,再套一层htmlspecialchars做HTML实体转义即可:
$url = 'https://example.com/?' . http_build_query($pars); $htmlSafeUrl = htmlspecialchars($url); // 输出到HTML页面 echo '<a href="' . $htmlSafeUrl . '">跳转链接</a>';
必须手动拼接的场景
你之前的写法错误在于:直接拼接&作为分隔符,如果拼接后的字符串是用于发起HTTP请求而非输出到HTML,&会被当作参数内容的一部分,自然会触发错误。正确的手动拼接逻辑:
- 先对每个参数的键、值做URL编码
- 拼接时用
&作为分隔符 - 只有最终要输出到HTML上下文时,才对完整URL做HTML实体转义
$param = ''; foreach($pars as $key => $val) { if ($param !== '') { $param .= '&'; } // 键值都做URL编码,避免特殊字符破坏参数结构 $param .= urlencode($key) . '=' . urlencode($val); } // 仅当需要输出到HTML时才做转义 $htmlSafeParam = htmlspecialchars($param);
内容的提问来源于stack exchange,提问作者Jin Sun
相关产品推荐
相关产品推荐

