【问题标题】:Completely validate URL with or without http or https使用或不使用 http 或 https 完全验证 URL
【发布时间】:2013-12-18 22:16:41
【问题描述】:

我对 PHP 中的 URL 验证进行了一些研究,发现 StackOverflow 上有许多不同的答案,有些比其他答案更好,有些则非常陈旧和过时。

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

example.com
www.example.com
http://example.com
http://www.example.com
https://example.com
https://www.example.com

PHP 带有一个function to validate URLs,但是,如果它没有http://,它会将 URL 标记为无效。

如何验证任何类型的 URL,无论有无 http://https://,以确保 URL 有效?

谢谢。

【问题讨论】:

  • 你为什么不简单地将http://附加到它上面呢?
  • 查看parse_url() 作为将 URL 分解为组件的功能,然后您可以修复您需要的任何内容,然后将它们全部缝合在一起以进行验证。有人在用户cmets中写了一个unparse_url()函数。
  • 检查字符串是否以http开头,如果不是,则追加。
  • @Scuzzy: parse_url() 是一个非常不适合启动任何形式的 URL 验证的选择。很难找到任何无法通过parase_url() 的输入。即使是带有多个模式和换行符的字符串也能通过。
  • @Bagwell 互联网老了,它仍然使用 TCP/IP。

标签: php regex


【解决方案1】:

如您所说,使用filter_var(),但是,根据定义,URL 必须包含协议。仅使用http 也会检查https

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

然后:

if(filter_var($url, FILTER_VALIDATE_URL)) {
    //valid
} else {
    //not valid
}

【讨论】:

  • 不幸的是,这将返回 true 尽管 $url = '0812345'。它将添加前缀“http://”,filter_var('http://0812345', FILTER_VALIDATE_URL) 将返回 true。有什么建议解决方案吗?
  • @fendiSetiawan 是什么让您认为这不是有效的 URL?
  • 当然,如果我运行parse_url('http://0812345'),它将以hostname 的形式返回“0812345”。从技术上讲,这是真的。但是,如果用户访问该 url,它将返回 not found。因为它不是带有 TLD 的 IP 地址或域。我希望一些验证仅在它是有效的 IP 地址或具有 TLD (example.com) 的 URL 网站时才返回 true。我在这里错了吗?还是我只是不知道 url 如何被称为“有效”?
  • 存在有效,然后存在或可达。应该有一个问题可以解决这个问题。如果没有,那就问一个。您可以在此处发布链接,因为我有一些想法。
  • 啊...我明白了...“无法访问的 URL”是我要找的。感谢您的帮助。对不起,如果我的问题使一些误解。谢谢。
【解决方案2】:

我也见过这种用法:

$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";
}

来源:http://codekarate.com/blog/validating-url-php

【讨论】:

  • 因为filter_var($url, FILTER_VALIDATE_URL); 太长了?
  • 验证这种东西是way much complexer
  • 因为filter_var 在 5.2 之前不可用,而且它不能很好地处理破折号。
  • 在 7 中它确实处理破折号
【解决方案3】:

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

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

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

}

【讨论】:

    【解决方案4】:

    你也可以让 html 验证 url:

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

    【讨论】:

    • 永远不应信任客户端验证。
    • @Aniket Chowdhury 这就是为什么您的答案超出主题: 1. OP 提到他正在寻找一种在 PHP 2 中进行上述验证的方法。即使我们忽略上述内容,“让 html验证 url”意味着,在 OP 提出的问题的上下文中,让前端进行验证并在后端接受它,这是完全不可接受的。是否应该进行前端验证不是手头的问题,因此是标志。
    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2022-10-21
    • 2016-12-07
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多