根据我的理解,在获取($_GET
)网址后,%20已经转换为空格。因此,如果我使用filter_var($url, FILTER_SANITIZE_URL)
函数,它将删除已经转换的空格。
如何解决这个问题,仍然使用上述功能?
或者我应该只使用str_replace()
?虽然这似乎与filter_var($url, FILTER_SANITIZE_URL)
结合使用。
答案 0 :(得分:0)
在调用filter_var之前,您可以使用urlencode($ url)。
为什么要尝试过滤$ url?
答案 1 :(得分:0)
所以我假设$url
在$_GET['url']
中使用之前直接从filter_var
(或某些或查询字符串参数)派生而没有任何其他修改?
如果这些URL中包含空格,您可能希望直接使用$_SERVER['QUERY_STRING']
中提供的原始查询字符串。当然,这意味着您需要手动解析您正在寻找的参数(可能使用explode('&')
- 请勿使用parse_str()
,因为它会为$_GET()
执行相同的转换操作)
答案 2 :(得分:0)
继续使用FILTER_SANITIZE_URL保留空格的一种方法是首先用两个不太可能彼此相邻的允许字符替换空格,然后替换后将它们替换回空格。
e.g。
str_replace('\/', ' ', filter_var(str_replace(' ', '\/', $url), FILTER_SANITIZE_URL));
注意:不完全确定\/
是最佳候选人。但我在安全的环境中使用它。
答案 3 :(得分:0)
这相当于FILTER_SANITIZE_URL
加上空格:
$value = preg_replace("/[^\x20-\x7E]/", "", $value);
答案 4 :(得分:0)
您网址中的%20
应 不 转换为空格,因为它们是原始值的一部分。如果它们被解码,则意味着您无法在URL中传输期间正确编码值。
您要在网址中传输的值:
My string with spaces & special characters
在网址中,必须将其编码为:
My%20string%20with%20spaces%20%26%20special%20characters
最终网址:
http://example.com?foo=My%20string%20with%20spaces%20%26%20special%20characters
这是您要在URL中作为查询参数传输的值。这意味着您需要将 it 正确编码为:
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