
在web开发中,我们经常需要通过url传递参数。php通过$_get超全局变量来获取这些参数。然而,当url参数的值本身包含特殊字符&时,php的默认行为会导致问题。
考虑以下URL: page.php?clss_type=Boys%20&%20Girls
如果尝试使用$_GET['clss_type']来获取clss_type的值,例如:
<?php echo $class = $_GET['clss_type']; ?>
期望的输出是Boys & Girls,但实际的输出会是Boys。这是因为PHP默认将&符号识别为URL查询字符串中不同参数的分隔符。当PHP解析到clss_type=Boys%20&%20Girls时,它会将第一个&视为clss_type参数的结束,并尝试将%20Girls解析为另一个参数(或忽略它,如果它不是一个有效的键值对)。
最标准和推荐的解决方案是对URL参数值中的特殊字符进行URL编码。&字符在URL编码中应被转义为%26。
在生成URL时,应确保参数值中的&被正确编码。 将page.php?clss_type=Boys%20&%20Girls修改为: page.php?clss_type=Boys%20%26%20Girls
这里,Boys & Girls被编码为Boys%20%26%20Girls。%20代表空格,%26代表&。
立即学习“PHP免费学习笔记(深入)”;
当URL被正确编码后,PHP的$_GET变量会自动对其进行解码,开发者无需额外操作。
<?php // 假设浏览器访问的URL是:page.php?clss_type=Boys%20%26%20Girls $class = $_GET['clss_type']; echo $class; // 输出: Boys & Girls ?>
在PHP中动态构造URL时,可以使用urlencode()函数来确保参数值被正确编码。
<?php $paramValue = "Boys & Girls"; $encodedValue = urlencode($paramValue); // 结果: Boys%20%26%20Girls // 构造完整的URL $url = "page.php?clss_type=" . $encodedValue; echo $url; // 输出: page.php?clss_type=Boys%20%26%20Girls // 在接收页面,$_GET 会自动解码 // $class = $_GET['clss_type']; // 此时 $class 的值就是 "Boys & Girls" ?>
urlencode()函数会将所有非字母数字字符(除了-._)编码为%xx的形式,这包括&、空格、=等,从而确保它们不会被误解析为URL结构的一部分。
另一种方法是改变PHP默认的参数分隔符,但这通常不推荐,因为它是一个全局配置,可能会影响服务器上所有PHP应用程序的行为,且不符合URL参数的通用约定。
在php.ini文件中,arg_separator.input指令定义了PHP用于解析GET参数的字符。默认值为&。 你可以将其修改为其他字符,例如分号;:
; php.ini arg_separator.input = ";"
修改后,需要重启Web服务器(如Apache、Nginx)或PHP-FPM服务使配置生效。
如果将arg_separator.input设置为;,那么你的URL构造方式也需要改变: page.php?clss_type=Boys%20&%20Girls;another_param=value 在这种情况下,clss_type的值中的&将不会被视为分隔符。
当URL参数值中包含&等特殊字符时,PHP的默认解析行为会导致数据丢失。为了正确获取这些参数,最推荐和标准的方法是对参数值进行URL编码,将&转义为%26。在PHP中,可以使用urlencode()函数来动态完成这一操作。接收端$_GET会自动解码,无需额外处理。
修改php.ini中的arg_separator.input虽然也能解决问题,但因其全局性、非标准性以及可能带来的兼容性问题,通常不建议采用。始终优先使用URL编码来处理URL参数中的特殊字符,以确保应用程序的健壮性和兼容性。
以上就是PHP URL参数中特殊字符'&'的处理:避免丢失与正确解析的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号