4

据我了解,在获取 ( $_GET) url 后,%20 已经转换为空格。因此,如果我随后使用该filter_var($url, FILTER_SANITIZE_URL)函数,它将删除已转换的空格。

我该如何解决这个问题,并且仍然使用上述功能?

还是我应该只使用str_replace()?尽管这似乎与filter_var($url, FILTER_SANITIZE_URL).

4

5 回答 5

0

您可以在调用 filter_var 之前使用 urlencode($url)。

你为什么要过滤 $url?

于 2012-11-28T23:44:05.067 回答
0

所以我假设在这种情况下,它$url是直接从$_GET['url'](或一些或查询字符串参数)派生的,在使用 in 之前没有任何其他修改filter_var

如果这些 URL 中包含空格,您可能希望直接使用$_SERVER['QUERY_STRING']. 当然,这意味着您需要手动解析出您正在寻找的参数(也许使用explode('&')- 不要使用parse_str(),因为它会执行相同的转换$_GET()

于 2012-11-28T23:45:58.053 回答
0

继续使用 FILTER_SANITIZE_URL 保留空格的一种方法是,首先用两个不太可能相邻出现的允许字符替换空格,然后将它们替换回空格。

例如

str_replace('\/', ' ', filter_var(str_replace(' ', '\/', $url), FILTER_SANITIZE_URL));

注意:不完全确定\/是最佳人选。但我已经在安全的环境中使用了它。

于 2014-10-15T00:43:39.017 回答
0

%20URL 中的s不应转换为空格,因为它们是原始值的一部分。如果它们正在被解码,则意味着您在 URL 中的传输过程中未能正确编码该值。

您要在 URL 中传输的值:

My string with spaces & special characters

在 URL 中,必须将其编码为:

My%20string%20with%20spaces%20%26%20special%20characters

最终网址:

http://example.com?foo=My%20string%20with%20spaces%20%26%20special%20characters

这是您要作为 URL 中的查询参数传输的值。这意味着您需要将正确编码为:

http%3A%2F%2Fexample.com%3Ffoo%3DMy%2520string%2520with%2520spaces%2520%2526%2520special%2520characters

最终到达网址:

http://my-service.example.com?url=http%3A%2F%2Fexample.com%3Ffoo%3DMy%2520string%2520with%2520spaces%2520%2526%2520special%2520characters

PHP 将对其进行一次解码,然后$_GET['url']您会发现:

http://example.com?foo=My%20string%20with%20spaces%20%26%20special%20characters
于 2016-04-06T07:19:45.923 回答
0

这相当于FILTER_SANITIZE_URL加一个空格:

$value = preg_replace("/[^\x20-\x7E]/", "", $value);
于 2016-04-06T07:11:58.500 回答