我正在尝试创建一个允许用户定义自己的自定义查询键的表单,当我测试表单的验证函数时,我注意到url查询键中的%20
被转换到$ _GET数组中的下划线。
$key = 'a b';
$key = rawurlencode($key);
$value = 'value';
print_r($_GET); // output: Array ( [a_b] => value )
echo '<p>key:' . $key . '</p>';
echo '<p>value:' . $value . '</p>';
echo '<p><a href="' . $_SERVER["REQUEST_URI"] . '?' . $key . '=' . $value . '">test</a></p>';
是否有其他角色不定期转换?我不确定“不规则”是否正确,因为这种行为可能有规则,但我没想到会发生这种情况。
答案 0 :(得分:2)
PHP用下划线替换某些字符,因为它们在变量名中是非法的。即使它们在数组键中是合法的,早期版本的PHP会将表单变量直接放在变量中(即$a_b
;请参阅Register Globals),因此这个转换被放入。这是通过空格,点来完成的,打开方括号,控制128到159之间的字符。
这仅通过名称本身来完成,而不是例如任何数组键参数(即http://example.com/foo.php?a[b.%20c]=1
),因为任何字符在数组键中都是合法的。 (请注意,数组参数功能本身意味着在某些情况下,如上所示,开放方括号不会被_
替换 - 示例将给出$_GET['a']['b. c'] == 1
。)
来源:http://ca.php.net/variables.external
相关问题:Get PHP to stop replacing '.' characters in $_GET or $_POST arrays?
答案 1 :(得分:2)
此函数将修复这些字符串。
$key = 'a b.c[d';
$key = fix_key($key);
$value = 'value';
$_GET[$key] = $value;
print_r($_GET);
echo '<p><a href="' . $_SERVER["REQUEST_URI"] . '?' . $key . '=' . $value . '">test</a></p>';
function fix_key($strKey) {
$search = array(chr(32), chr(46), chr(91));
for ($i=128; $i <= 159; $i++) array_push($search, chr($i));
return str_replace ( $search , '_', $strKey);
}