【问题标题】:PHP regex for url validation, filter_var is too permisive用于 url 验证的 PHP 正则表达式,filter_var 过于宽松
【发布时间】:2010-09-06 19:27:17
【问题描述】:

首先让我们根据我的要求定义一个“URL”。

可选允许的唯一协议是http://https://

然后是一个强制性域名,例如stackoverflow.com

然后是可选的其余 url 组件(pathqueryhash,...)

根据我的要求参考有效和无效网址的列表

有效

无效

  • http://www(php filter_var 允许这个,是的,我知道是 valid url)
  • 谷歌
  • http://www..des(php filter_var 允许这个)
  • 域名中包含不允许字符的任何网址

为了完整起见,这里是我的 php 版本:5.3.2-1ubuntu4.2

【问题讨论】:

  • 您的 TLD 下的域名带有破折号?给我看。
  • 我希望你知道现在有 internationalized domain names 可以使 URL 验证正则表达式变得非常混乱。
  • 此外,“有效”URL 可以包含很多内容,但您的问题中没有指定。有关完整规范,请参阅:w3.org/Addressing/URL/url-spec.txt
  • @Pekka expert-sex-change.com 用于重定向到 stackoverflow.com(现已过期)
  • @Null aarrgh,当然,我把它和下划线 _ 混在一起了。我自己拥有许多带有破折号的域。我该收工了!不过,我不明白 filter_var 如何拒绝这个。

标签: php regex validation url


【解决方案1】:

作为起点你可以使用这个,它是为 JS 设计的,但它很容易转换为 PHP preg_match

/^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$/i

对于 PHP 应该可以使用这个:

$reg = '@^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$@i';

无论如何,此正则表达式仅验证域部分,但您可以处理此问题或在第一个斜杠 '/'"://" 之后)处拆分 url,并分别验证域部分和休息。

顺便说一句:它也会验证 "http://www.domain.com.com" 但这不是错误,因为子域 url 可能类似于:"http://www.subdomain.domain.com" 并且它是有效的!并且几乎没有办法(或至少没有操作简单的方法)使用正则表达式验证正确的域 tld,因为您必须像这样一个接一个地将所有可能的域 tld 内联写入您的正则表达式:

/^(https?\://)?(www\.)?([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+(com|it|net|uk|de)$/i

(例如,最后一个将仅验证以 .com/.net/.de/.it/.co.uk 结尾的域)。 总是有新的 tld 出现,所以每次有新的 tld 出现时,您都必须调整正则表达式,这很让人头疼!

【讨论】:

    【解决方案2】:

    您可以使用parse_url 将地址分解为其组成部分。虽然它明确不是为验证 URL 而构建的,但分析生成的组件并将它们与您的要求相匹配至少是一个开始。

    【讨论】:

      【解决方案3】:

      它可能会有所不同,但在大多数情况下,您实际上并不需要检查任何 URL 的有效性。

      如果它是重要信息,并且您足够信任您的用户让他通过 URL 提供它,那么您可以足够信任他以提供有效的 URL。

      如果它不是重要信息,那么您只需检查 XSS 尝试并显示用户想要的 URL。

      如果您没有检测到“http://”,您可以手动添加一个“http://”以避免导航问题。


      我知道,我不会为您提供替代解决方案,但也许解决性能和有效性问题的最佳方法就是避免不必要的检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2023-03-21
        • 2015-11-08
        • 2012-02-22
        • 2018-08-06
        • 2011-05-16
        相关资源
        最近更新 更多