0

我正在尝试创建一个允许用户定义自己的自定义查询键的表单,当我测试表单的验证功能时,我注意到%20在 url 查询键被转换为 $_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>';

是否有其他字符转换不规则?我不确定“不规则”在这里是不是正确的词,因为这种行为可能有一个规则,但我没想到会发生这种情况。

4

2 回答 2

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

相关问题:让 PHP 停止替换 '.' $_GET 或 $_POST 数组中的字符?

于 2012-10-05T04:18:34.907 回答
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);
}
于 2012-10-06T06:03:09.107 回答