PHP正则表达式用于url验证,过滤器变量的权限太大

PHP正则表达式用于url验证,过滤器变量的权限太大,php,regex,validation,url,Php,Regex,Validation,Url,首先让我们根据我的需求定义一个“URL” 唯一可以选择的协议是http://和https:// 然后是一个强制性域名,如stackoverflow.com 然后可选地选择剩余的url组件(路径,查询,哈希,…) 根据我的要求,提供有效和无效url的列表以供参考 有效的 stackoverflow.com stackoverflow.com/questions/ask amazon.com/Computers internetbook/b/ref=bhp_bb0309A_comint2?ie

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

唯一可以选择的协议是
http://
https://

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

然后可选地选择剩余的url组件(
路径
查询
哈希
,…)

根据我的要求,提供有效和无效url的列表以供参考

有效的
  • stackoverflow.com
  • stackoverflow.com/questions/ask
  • amazon.com/Computers internetbook/b/ref=bhp_bb0309A_comint2?ie=UTF8&node=5&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=browse&pf_rd_r=0AH7GM29WF81Q72VPFDH&pf_rd_t=101&pf_rd_p=1273387142&pf_rd_i=28315;

  • (筛选变量拒绝此!!!我有带破折号的域名)

无效的
  • (php filter_var允许这样做,是的,我知道这是一个有效的url)
  • 谷歌
  • (php筛选器_var允许此操作)
  • 域名中不允许包含字符的任何url

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

您可以使用它将地址分解为它的组件。虽然它不是为了验证URL而构建的,但分析生成的组件并将它们与您的需求进行匹配至少是一个开始

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

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

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

如果未检测到“http://”,则可以手动添加“http://”,以避免导航问题



我知道,我没有给你一个替代方案作为解决方案,但也许解决性能和有效性问题的最好方法就是避免不必要的检查。

作为一个起点,你可以使用这个,它适用于JS,但是很容易将它转换为适用于PHP
preg\u 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';
无论如何,此regexp只验证域部分,但您可以处理此问题或在第一个斜杠处拆分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时,您都必须调整您的正则表达式,这真是一件麻烦事

你的域名在带破折号的TLD下?让我看看。我希望你知道,现在有一些东西会让URL验证正则表达式变得非常混乱。另外,有很多东西“有效”URL可以包含,但在你的问题中没有指定。有关完整的规范,请参见:@Pekka用于重定向到stackoverflow.com(现已过期)@Null aarrgh,当然,我将其与下划线混为一谈。我自己也有很多带破折号的域名。我该收工了!不过,我不明白filter_var怎么会拒绝这个。