据我了解,在获取 ( $_GET
) url 后,%20 已经转换为空格。因此,如果我随后使用该filter_var($url, FILTER_SANITIZE_URL)
函数,它将删除已转换的空格。
我该如何解决这个问题,并且仍然使用上述功能?
还是我应该只使用str_replace()
?尽管这似乎与filter_var($url, FILTER_SANITIZE_URL)
.
据我了解,在获取 ( $_GET
) url 后,%20 已经转换为空格。因此,如果我随后使用该filter_var($url, FILTER_SANITIZE_URL)
函数,它将删除已转换的空格。
我该如何解决这个问题,并且仍然使用上述功能?
还是我应该只使用str_replace()
?尽管这似乎与filter_var($url, FILTER_SANITIZE_URL)
.
您可以在调用 filter_var 之前使用 urlencode($url)。
你为什么要过滤 $url?
所以我假设在这种情况下,它$url
是直接从$_GET['url']
(或一些或查询字符串参数)派生的,在使用 in 之前没有任何其他修改filter_var
?
如果这些 URL 中包含空格,您可能希望直接使用$_SERVER['QUERY_STRING']
. 当然,这意味着您需要手动解析出您正在寻找的参数(也许使用explode('&')
- 不要使用parse_str()
,因为它会执行相同的转换$_GET()
)
继续使用 FILTER_SANITIZE_URL 保留空格的一种方法是,首先用两个不太可能相邻出现的允许字符替换空格,然后将它们替换回空格。
例如
str_replace('\/', ' ', filter_var(str_replace(' ', '\/', $url), FILTER_SANITIZE_URL));
注意:不完全确定\/
是最佳人选。但我已经在安全的环境中使用了它。
%20
URL 中的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
这相当于FILTER_SANITIZE_URL
加一个空格:
$value = preg_replace("/[^\x20-\x7E]/", "", $value);