PHP - filter_var返回false甚至用urlencode

问题描述:

$url="http://www.example.com/日本語/こんにちは.html"; 
$result=filter_var(urlencode($url), FILTER_VALIDATE_URL); 

我编码URL!那么,为什么是$returnfalsePHP - filter_var返回false甚至用urlencode

+0

的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

+0

@deceze这在过滤器中仍然无效。 – Blackbam

+0

@Blackbam ...? https://3v4l.org/POAWp – deceze

您使用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()是编码参数不是整个网址。