PHP Url验证错误:http:// https://example.com(又名https:// https://example.com)

时间:2011-11-23 07:19:18

标签: php regex validation url

我有这个url正则表达式模式:

$pattern = "@\b(https?://[^\s()<>\[\]\{\}]{1,".$max_length_allowed_for_each_url."}(?:\([\w\d]+\)|([^[:punct:]\s]|/)))@";

它似乎很好地验证了我投入的任何URL,直到我意识到https://http://google.com(显然甚至stackoverflow正在考虑一个有效的URL(它使该URL可点击,而不是我,尽管它确实删除其中一个冒号)所以也许我运气不好?)是一个有效的URL,当它肯定不是。

我做了一些研究......并且知道我should be using filter_var instead of a regex for PHP URL validation无论如何......并且很高兴意识到它也容易受到同样的验证问题的影响。

我可以轻松地用:

来征服它
str_replace(array("https://http://","http://https://"), array("http://","https://"), $url);

但是......这似乎是错误的。

1 个答案:

答案 0 :(得分:2)

嗯,这是一个有效的URI。技术上。如果你不相信我,请查看RFC的URI。

  • URI的路径组件可以包含//
  • http是有效的主机名。
  • 即使:存在,也允许端口丢失(指定为*digit,而不是1*digit)。 (这就是为什么Stack Overflow删除了冒号 - 它认为你使用的是默认端口,所以它将它从URI中删除了。)

我建议为此写一个特例。在单独的步骤中,检查URI是否以https?://https?://开头,然后修复它。