PHP - filter_var返回false甚至用urlencode
问题描述:
$url="http://www.example.com/日本語/こんにちは.html";
$result=filter_var(urlencode($url), FILTER_VALIDATE_URL);
我编码URL!那么,为什么是$return
false
?PHP - filter_var返回false甚至用urlencode
答
您使用urlencode
编码查询参数值。它编码具有特殊意义的网址,字符,如:
,/
,?
等
如果编码完整的网址 - 而不是值在查询部分 - 它不是一个有效的URL了。
这是您的网址您编码之后:
http%3A%2F%2Fwww.example.com%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%2F%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF.html
答
因为它不是可能是一个有效的URL:
http://php.net/manual/de/filter.filters.validate.php
从文档:
void验证值作为URL(根据» http://www.faqs.org/rfcs/rfc2396),任选地与所需 组件。请注意,有效的网址可能不会指定HTTP协议,因此可能需要进一步的验证以确定网址 使用预期的协议,例如, ssh://或mailto :.请注意, 函数只会发现ASCII URL有效;国际化 域名(包含非ASCII字符)将失败。
URL编码的URL总是失败,因为urlencode会向URL添加无效的charactares。此功能不适用于使用中文字符验证网址。
特别是最后一行说的确切:请注意, 函数只会发现ASCII URL有效;国际化 域名(包含非ASCII字符)将失败。
编辑:@jeroen是右btw urlencode()
是编码参数不是整个网址。
的URL必须是'http://example.com/%E6%97%A5%E6%9C%AC%E8%AA% 9E /%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF.html'。在事实只有一个无效的URL作为起点之后,您无法轻易修复该问题。 – deceze
@deceze这在过滤器中仍然无效。 – Blackbam
@Blackbam ...? https://3v4l.org/POAWp – deceze