PHP网址验证误报

时间:2015-05-11 23:25:09

标签: php regex validation

由于某些奇怪的原因,使用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
}

1 个答案:

答案 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字符)将失败。

  •