我有这个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);
但是......这似乎是错误的。
答案 0 :(得分:2)
嗯,这是一个有效的URI。技术上。如果你不相信我,请查看RFC的URI。
//
。http
是有效的主机名。:
存在,也允许端口丢失(指定为*digit
,而不是1*digit
)。 (这就是为什么Stack Overflow删除了冒号 - 它认为你使用的是默认端口,所以它将它从URI中删除了。)我建议为此写一个特例。在单独的步骤中,检查URI是否以https?://https?://
开头,然后修复它。