PHP中rawurldecode()无法显示加号,如何获取URL中的my+string?
解决URL中%2B无法正确解析为+的问题
首先得把问题根源说清楚:当浏览器请求abc.com/my%2Bstring时,Web服务器(比如Apache或Nginx)通常会先对路径部分做一次URL解码,把%2B转换成+。这时候如果你直接拿$_SERVER['PATH_INFO']这类变量,得到的已经是my+string;要是这时候你再调用urldecode(),就会把+进一步转换成空格——这就是你拿到空格的原因!
下面分两种场景给你解决方案:
场景1:直接获取原始编码的路径内容
如果你想拿到URL里未被服务器解码的原始字符串(比如my%2Bstring),可以读取$_SERVER['REQUEST_URI']来提取路径部分,再用rawurldecode()解码:
$request_uri = $_SERVER['REQUEST_URI']; // 去掉URI开头的斜杠,拿到路径部分 $path_part = ltrim($request_uri, '/'); // 解码后得到my+string $decoded_value = rawurldecode($path_part); echo $decoded_value;
场景2:处理已被服务器解码的内容
如果你拿到的变量已经是服务器解码后的my+string(比如从$_SERVER['PATH_INFO']获取),千万别再用urldecode(),直接用这个值就能得到my+string;要是不小心已经做了urldecode得到了空格,也可以把空格替换回+:
// 假设$wrong_value是已经被urldecode过的"my string" $corrected_value = str_replace(' ', '+', $wrong_value); echo $corrected_value;
关键注意点
urldecode():会同时把+转成空格、解码%XX格式字符rawurldecode():只解码%XX格式字符,不会处理+- Web服务器会自动解码URL的路径和查询参数,所以
$_GET、$_SERVER['PATH_INFO']这类全局变量已经是解码后的结果,别重复解码!
内容的提问来源于stack exchange,提问作者C. Ovidiu
相关产品推荐
相关产品推荐

