GET请求含特殊字符参数在PHP接收时转义异常求助
解决URL参数中%被额外转义的问题
这个问题的核心是你绕开了PHP自带的URL参数解码机制,手动解析$_SERVER['QUERY_STRING']导致拿到了编码后的原始值。下面给你两种实用的解决方案:
方案一:直接使用PHP的$_GET数组(推荐)
PHP会自动帮你完成URL参数的解码工作,$_GET数组里的参数值已经是处理后的原始内容,完全不需要自己写字符串截取函数来解析:
if($action == 11){ // 直接获取解码后的searchKey值 $result = $_GET['searchKey']; echo $result; // 这里会输出你想要的12% }
方案二:手动解析后再解码(仅特殊场景使用)
如果因为某些限制必须手动处理QUERY_STRING,那你需要对取出的结果调用urldecode()函数进行解码:
if($action == 11){ $query = $_SERVER['QUERY_STRING']; $encodedResult = between('searchKey=', '&', $query); $result = urldecode($encodedResult); // 把编码后的%25解码回% echo $result; // 输出12% } // 顺便优化一下你的字符串处理函数,增加异常判断 function after ($thisStr, $inthat) { $pos = strpos($inthat, $thisStr); if ($pos !== false) return substr($inthat, $pos + strlen($thisStr)); return ''; }; function before ($thisStr, $inthat) { $pos = strpos($inthat, $thisStr); if ($pos !== false) return substr($inthat, 0, $pos); return $inthat; }; function between ($thisStr, $thatStr, $inthat) { return before($thatStr, after($thisStr, $inthat)); };
为什么原来的代码会出问题?
当你发送searchKey=12%的请求时,浏览器会自动把URL中的%编码成%25(因为%是URL编码的特殊字符),所以$_SERVER['QUERY_STRING']里的内容是action=11&searchKey=12%25。你的between函数取出的是编码后的12%25,而PHP的$_GET已经自动将%25解码回%,所以直接用$_GET是最省心且不易出错的方式。
内容的提问来源于stack exchange,提问作者user5443928
相关产品推荐
相关产品推荐

