【问题标题】:Is FILTER_VALIDATE_URL being too strict?FILTER_VALIDATE_URL 是否过于严格?
【发布时间】:2012-03-21 07:44:36
【问题描述】:

在 PHP 中,filter_var('www.example.com', FILTER_VALIDATE_URL) 返回 false。它是否正确? www.example.com 不是一个有效的 URL,或者协议(http://、ftp:// 等)需要在 URL 中明确说明才能正式正确吗?

【问题讨论】:

    标签: php url


    【解决方案1】:

    这不是一个有效的 URL。使用http:// 前缀从来都不是一件对用户非常友好的事情,所以现代浏览器认为如果你只是输入一个域名,你的意思是http。软件库确实有点挑剔!

    您可以采取的一种方法是将字符串传递给parse_url,然后添加任何缺少的元素,例如

    if ( $parts = parse_url($url) ) {
       if ( !isset($parts["scheme"]) )
       {
           $url = "http://$url";
       }
    }
    

    有趣的是,当您使用 FILTER_VALIDATE_URL 时,它实际上在内部使用 parse_url 来确定方案是什么(view source)。感谢 salathe 在下面的 cmets 中发现了这一点。

    【讨论】:

    • 感谢您的解释!我会使用你说的parse_url 方法,我比filter_var 更喜欢它
    • 星期三琐事:FILTER_VALIDATE_URL 使用parse_url() 检查是否有方案。
    • 不错!我会把它添加到答案中!
    • 抱歉这个愚蠢的问题,但是如果地址应该是 https:// 而不是 http:// 怎么办?也感谢上面的帮助!!
    • 您可以简单地检查$parts["scheme"]=='http' 并将网址重构为https 吗?
    【解决方案2】:

    URL 必须与 RFC 2396 中设置的规则相对应,并且根据该规范,协议是必需的。

    【讨论】:

      【解决方案3】:

      除了 Paul Dixon 的回答我想说的是,您可以使用 flags 代替 FILTER_VALIDATE_URL 来指定必须呈现 URL 的哪一部分。

      FILTER_FLAG_SCHEME_REQUIRED
      FILTER_FLAG_HOST_REQUIRED
      FILTER_FLAG_PATH_REQUIRED
      FILTER_FLAG_QUERY_REQUIRED
      

      由于 PHP 5.2.1 默认使用 FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED 标志,不幸的是,没有办法禁用它们(如果URL方案部分的存在不一定)。这对我来说似乎是一个错误。有亲戚bugreport

      【讨论】:

      • 这似乎使它不验证任何网址。 3v4l.org/1TjA5
      • @RussellSilva,Derokorian 你是对的,我不能让它工作。对我来说它看起来像一个错误。我更新了我的答案。
      【解决方案4】:

      FILTER_VALIDATE_URL 需要方案(“协议”)部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 2023-02-06
        • 2017-03-17
        相关资源
        最近更新 更多