由于某些奇怪的原因,使用FILTER_VALIDATE_URL检查网址的if语句会返回意外结果。
像https://www.google.nl/这样的简单内容被阻止,但www.google.nl/不是吗?它不像它阻止每个URL使用http或https infront。有些是允许的,有些则不是,我知道有很多主题,但大多数都使用正则表达式来过滤网址。这比使用FILTER_VALIDATE_URL好吗?或者我做错了什么?
我用来检查URLS的代码是
if (!filter_var($linkinput, FILTER_VALIDATE_URL) === FALSE) {
//error code
}
答案 0 :(得分:0)
你应该首先过滤它。 (只是为了好的措施)。
$url = filter_var($url, FILTER_SANITIZE_URL);
FILTER_VALIDATE_URL只接受ASCII URL(即需要编码)。如果上述功能不起作用,请参阅PHP urlencode()以对URL进行编码。
如果那个不起作用,那么你应该从头开始手动剥离http:......
$url = strpos($url, 'http://') === 0 ? substr($url, 7) : $url;
以下是一些可能有用的标志。如果您的网址所有都有http://
,您可以使用 FILTER_FLAG_SCHEME_REQUIRED
FILTER_VALIDATE_URL过滤器验证网址。
可能的标志:
- FILTER_FLAG_SCHEME_REQUIRED - 网址必须符合RFC标准(如http://example)
- FILTER_FLAG_HOST_REQUIRED - 网址必须包含主机名(如http://www.example.com)
- FILTER_FLAG_PATH_REQUIRED - 网址必须包含域名后的路径(例如www.example.com/example1/)
- FILTER_FLAG_QUERY_REQUIRED - 网址必须包含查询字符串(例如“example.php?name = Peter& age = 37”)
FILTER_VALIDATE_URL的默认行为
将值验证为URL(根据» http://www.faqs.org/rfcs/rfc2396),可选择必填项 组件。
请注意,有效的URL可能未指定HTTP协议 http://因此可能需要进一步验证以确定URL 使用预期的协议,例如ssh://或mailto:。
请注意 函数只能找到有效的ASCII网址 ;国际 域名(包含非ASCII字符)将失败。