-2

我总是通过 $_SERVER['QUERY_STRING'] 或 $_SERVER['REQUEST_URI'] 获取查询字符串和路径,但有时会得到无效值,

#1
?a[]=1&b[]=2
(should be: ?a%5B%5D=1&b%5B%5D=2)

#2
?c%5B%5D=3&d[]=4
(should be: ?c%5B%5D=3&d%5B%5D=4)

#3
/to/path*/a/1
(should be: /to/path%2A/a/1)

#4
/to/path%2A/a*/1
(should be: /to/path%2A/a%2A/1)

我如何始终获得已编码的字符串?如果使用 urlencode() 是个坏主意,因为某些字符已被编码或不应该被编码。

4

1 回答 1

1

不是最干净的解决方案,但目前这是我唯一能想到的:

function parse ($string, $allowed = array('?', '=', '/')) {
    $chars = str_split(urldecode($string));
    $encoded = '';
    foreach ($chars as $char) {
        if (in_array($char, $allowed)) {
            $encoded .= $char;
            continue;
        }
        $encoded .= urlencode($char);
    }

    return $encoded;
}

演示:http ://codepad.org/QKFSWmHs

发生的情况是首先对字符串进行解码以对其进行规范化(我们是否应该担心双重编码?)。之后我们简单地遍历所有字符并检查字符是否应该被编码。

于 2013-06-30T13:41:19.150 回答