【问题标题】:Validating a URL in PHP [duplicate]在 PHP 中验证 URL [重复]
【发布时间】:2011-10-23 14:57:09
【问题描述】:

可能重复:
PHP validation/regex for URL

是否有任何简单、安全和快速的方法来检查一个 URL 在 PHP 中是否有效?

【问题讨论】:

  • 有效,因为它正确解析?或者如果它只是一个跟随 URL 的 RFP 的字符串?

标签: php url


【解决方案1】:

这取决于您对有效的定义。语义有效,域名解析等。

快速的方法是使用 preg_match 对照良好的正则表达式测试 url,以验证其格式是否正确。这个线程上似乎有一些很好的例子PHP validation/regex for URL

【讨论】:

  • 我的意思是“有效”,如果它有 http:// 并以 .EXT 结尾
  • @Oliver:注意这个问题的 URL。根据您的定义,这不是一个有效的 URL。
  • 那么 preg_match 与一个好的正则表达式或 filter_var php.net/manual/en/filter.filters.validate.php 是你最好的选择。如果你走正则表达式路线,请确保你得到一个涵盖所有有效用例(http:// https:// FQDN 等)的好方法
【解决方案2】:

是的,有!使用filter_var

if (filter_var($url, FILTER_VALIDATE_URL) !== false) ...

FILTER_VALIDATE_URL 根据RFC 2396 验证 URL。

【讨论】:

  • FILTER_VALIDATE_URL 不可靠,它无法验证基于 IPv6 地址的 URL。我在搜索有关不使用它的 PHP URL 验证的任何问题时偶然发现了这一点,因为我发现它几乎没用。
  • 这被解释为一个有效的url,正确显示cookie:echo filter_var('http://example.com/"><script>alert(document.cookie)</script>', FILTER_VALIDATE_URL);请注意5.4中的filter_var();
  • 关于 GordonM 的评论,请查看以下要点,了解 PHP 的 FILTER_VALIDATE_URL 可能无法按照您的预期工作的示例:gist.github.com/anonymous/10967187
  • 你为什么用(filter_var($url, FILTER_VALIDATE_URL) !== false)而不是(filter_var($url, FILTER_VALIDATE_URL))
  • @GordonM - 有“FILTER_FLAG_IPV6”允许 IPv6 地址有效 - php.net/manual/en/filter.filters.flags.php
【解决方案3】:

如果我们查看RFC 3986,我们可以找到 URL 的定义。

如果我们看一下附录 B,这里有使用正则表达式解析 URL 的指南:

附录 B. 使用正则表达式解析 URI 引用

由于“第一场比赛获胜”算法与“贪婪”算法相同
POSIX正则表达式使用的消歧方法,它是
使用正则表达式进行解析是很自然且司空见惯的
URI 引用的潜在五个组成部分。

下面一行是分解a的正则表达式
对其组件的格式良好的 URI 引用。

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9

上面第二行的数字只是为了帮助 可读性;它们指示每个参考点 子表达式(即每个成对的括号)。我们指的是 与子表达式匹配的值为 $。例如,匹配 上面的表达式为

  http://www.ics.uci.edu/pub/ietf/uri/#Related

导致以下子表达式匹配:

  $1 = http:
  $2 = http
  $3 = //www.ics.uci.edu
  $4 = www.ics.uci.edu
  $5 = /pub/ietf/uri/
  $6 = <undefined>
  $7 = <undefined>
  $8 = #Related
  $9 = Related

其中表示组件不存在,如 上面示例中的查询组件就是这种情况。 因此,我们可以将五个分量的值确定为

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9

反过来,我们可以重新创建一个 URI 引用 使用第 5.3 节的算法从其组件中提取。

您可以使用此正则表达式手动解析 URL 或使用 PHP 4 和 5 中内置的 parse_url function avalable

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2012-05-13
    • 2013-10-24
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多