Php 使用或不使用http或https完全验证URL

Php 使用或不使用http或https完全验证URL,php,regex,Php,Regex,我在PHP中对验证URL做了一些研究,发现关于StackOverflow有很多不同的答案,有些比其他答案更好,有些则非常陈旧过时 我有一个字段,用户可以输入他们网站的url。用户应能够以任何形式输入URL,例如: example.com www.example.com http://example.com http://www.example.com https://example.com https://www.example.com PHP附带了一个,但是,如果没有http://,它会将U

我在PHP中对验证URL做了一些研究,发现关于StackOverflow有很多不同的答案,有些比其他答案更好,有些则非常陈旧过时

我有一个字段,用户可以输入他们网站的url。用户应能够以任何形式输入URL,例如:

example.com
www.example.com
http://example.com
http://www.example.com
https://example.com
https://www.example.com
PHP附带了一个,但是,如果没有
http://
,它会将URL标记为无效

我如何验证任何类型的URL,无论是否使用
http://
https://
,以确保URL有效

谢谢。

使用
过滤器\u var()
,但是,根据定义,URL必须包含协议。仅使用
http
也将检查
https

$url = strpos($url, 'http') !== 0 ? "http://$url" : $url;
然后:


我也看到过这种用法:

$url = "http://example.com";
if (preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $url)) {
  echo "URL is valid";
}
else {
  echo "URL is invalid";
}

来源:

您还可以让html验证url:

Website: <input type="url" name="website" required pattern="https?://.+">
网站:

您可以创建自定义验证规则,然后在其中添加以下方法:

protected function prepareForValidation()
{
        $urlWithHttp = strpos($this->url, 'http') !== 0 ? "http://$this->url" : $this->url;

        $this->merge([
            'url' => $urlWithHttp,
        ]);

}

为什么不简单地将
http://
附加到它上面呢?请查看
parse_url()
函数,将url分解为组件,然后可以修复任何需要的内容,然后将其重新缝合以进行验证。有人在用户评论中编写了一个
unparse_url()
函数。请检查字符串是否以http开头,如果不是,请将其追加。@Scuzzy:
parse_url()
对于启动任何形式的url验证都是非常不合适的选择。很难找到任何不通过
parase\u url()
的输入。即使是带有多个模式和换行符的字符串也能通过。@Bagwell互联网很旧,它仍然使用TCP/IP。因为
filter\u var($url,filter\u VALIDATE\u url)太长?验证这类内容是因为
filter\u var
在5.2之前不可用,而且它不能很好地处理破折号。在7中,它可以处理破折号客户端验证永远不应该被信任。@Aniket Chowdhury以下是您的答案脱离主题的原因:1。OP提到他正在寻找用PHP2进行上述验证的方法。即使我们忽略了上述内容,“让html验证url”意味着,在OP提出的问题的上下文中,让前端进行验证并在后端接受它,这是完全不可接受的。前端验证是否应该进行不是手头的问题,因此需要标记。不幸的是,这将返回
true
,尽管
$url='0812345'
。它将添加前缀“http://”和
filter\u var('http://0812345,过滤器(验证URL)
将返回
true
。有什么建议吗?@fendiSetiawan什么让你认为那不是一个有效的URL?当然,如果我运行
parse_URL('http://0812345)
它将返回“0812345”作为
hostname
。从技术上讲,这是真的。但是,若用户访问该url,它将返回NotFound。因为它不是TLD的IP地址或域。我希望只有当它是有效的IP地址或带有TLD的url网站(example.com)时,一些验证才会返回true。我错了吗?或者我只是不知道url如何被称为“有效”?有有效的,然后有现有的或可访问的。应该有一个问题可以解决这个问题。如果没有,那么问一个。你可以在这里发布链接,因为我有一些想法。啊。。。我懂了。。。“无法访问的URL”是我要找的。谢谢你的帮助。对不起,如果我的问题让人误解了。谢谢
protected function prepareForValidation()
{
        $urlWithHttp = strpos($this->url, 'http') !== 0 ? "http://$this->url" : $this->url;

        $this->merge([
            'url' => $urlWithHttp,
        ]);

}