【问题标题】:Validate that a given URL path is valid验证给定的 URL 路径是否有效
【发布时间】:2020-07-04 02:36:30
【问题描述】:

如何将以下字符串视为无效的 URL 路径,因为它实际上包含主机名而不代表有效路径:

/<>//google.com

通过使用以下正则表达式验证代码:

preg_match(""/(?:[\w-]+\.)+[\w-]+/"", $url, $matches);

我目前收到true 两个: /&lt;&gt;//google.com/3.2/

而“/3.2/”是合法的 URL 路径而不是域名

【问题讨论】:

  • 网址验证很难。
  • 为什么不使用 url 库而不是正则表达式?
  • @DanielA.White 你熟悉一个好的库 API 来验证它吗?
  • 公平地说,google.com 可以 成为有效路径的一部分,从技术上讲...没有什么可以阻止你拥有像 www.mysite.com/sitemap/for/google.com 这样的东西,如果你愿意的话。
  • 问题是www.domain.com/google.com 可能是一个有效的 URL(技术上),所以你需要拼凑一些东西来解析路径组件并拒绝特定的东西; is 是关于字符串 google.com 的,它会使路径无效但 not google.html (例如)或 google.womble ?从技术上讲,它们都很好。

标签: php regex validation url


【解决方案1】:

也许您也可以使用 FILTER_VALIDATE_URL 并传递 FILTER_FLAG_PATH_REQUIRED 标志。

filter_var('http://host.com/path', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED);

https://www.php.net/manual/en/filter.filters.validate.php

https://www.php.net/manual/en/intro.filter.php

【讨论】:

    【解决方案2】:

    根据herehere 的答案,我想出了这样的事情:

    function is_valid_url_path($url_path) {
      return preg_match("#^\/*[a-z0-9+&@=~_|!:,.;-]*\/*(%[0-9]([a-f]|[0-9]]))*/*$#i", $url_path);
    }
    
    print is_valid_url_path('/3.2/'); // 1
    print is_valid_url_path('//3.2/'); // 1
    print is_valid_url_path('/3.2///%3F'); // 1
    print is_valid_url_path('/3.2///%3'); // 0
    print is_valid_url_path("/<>//google.com"); // 0
    

    我在正则表达式中考虑的事情:

    • 允许的字符:a-z A-Z 0-9 . - _ ~ ! $ &amp; ' ( ) * + , ; = : @

    • Percent-encodingDIGIT + (DIGIT | (A|B|C|D|E|F))(例如%23%3B

    • 一个路径包含多个空段,例如///hello//world

    • 路径以?# 或简单地以 URI 结尾结束

    另见RFC 3986, Sec. 3.3. Path

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多