【问题标题】:PHP check if url is validPHP 检查 url 是否有效
【发布时间】:2015-08-20 08:21:53
【问题描述】:

我想知道在 php 中检查提供的 url 是否有效的最佳方法是什么...起初我尝试过:

filter_var($url, FILTER_VALIDATE_URL) === false

但它不接受www.example.com(无协议)。所以我尝试了一个简单的修改:

protected function checkReferrerUrl($url) {
    if(strpos($url, '://') == false) {
        $url = "http://".$url;
    }
    if(filter_var($url, FILTER_VALIDATE_URL) === false) {
        return false;
    }
    return true;
}

现在它可以与www.example.com 一起正常工作,但也可以接受简单的foo,因为它转换为http://foo。然而,虽然这不是一个有效的公共网址,但我认为......那你有什么建议?回到传统的正则表达式?

【问题讨论】:

  • 是的,我想说正则表达式是要走的路。有很多用于 URL 验证的模式,所以如果你不想自己写一个,你总能找到一个。
  • 这取决于您所说的“有效”。它应该存在,即成功响应请求吗?在这种情况下,link 可能就是您要查找的内容。
  • 我只是想检查一下推荐人是否确定我是否应该显示一些东西。但是有可能在输入配置的那一刻,这样的链接不存在(即一些网站将在不久的将来发布,管理员想提前配置一些东西)

标签: php url-validation


【解决方案1】:

我建议您不要使用带有 URL 类型的 filter_var。 还有更多的副作用。 例如,这些是根据 filter_var 的有效 URL:

http://example.com/"><script>alert(document.cookie)</script>
http://example.ee/sdsf"f

另外,FILTER_VALIDATE_URL 不支持国际化域名 (IDN)。

出于安全原因,我建议在之后使用正则表达式和一些 ifs(例如域)。 没有安全方面,我使用 parse_url 来完成我的工作。但是这个函数有一个类似的问题,当缺少方案(没有 http/https)时。

【讨论】:

    【解决方案2】:

    使用这个

    <?php
    $url = 'www.example.com';
    
    if(validateURL($url)){
           echo "Valid";
        }else{
            echo "invalid";
        }
    
    function validateURL($URL) {
          $pattern_1 = "/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
          $pattern_2 = "/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";       
          if(preg_match($pattern_1, $URL) || preg_match($pattern_2, $URL)){
            return true;
          } else{
            return false;
          }
        }
    ?>
    

    也试试这个

    <?php
    
    // Assign URL to $URL variable
    $url = 'http://example.com';
    
    // Check url using preg_match
    if (preg_match("/^(https?:\/\/+[\w\-]+\.[\w\-]+)/i",$url)){
        echo "Valid";
        }else{
            echo "invalid";
        }
    
    ?>
    

    【讨论】:

    • 您需要在此处添加pl 像这样biz|se|pl
    • 我知道...但是您知道您必须以这种方式列出多少个顶级域吗?
    • 这不适用于 .ki、.km、.kn、.kp、.kr、.kw、.ky、.kz、.la、.lb、.lc、.li、. lk、.lr、.ls、.lt、.lu、.lv、.ly、.ma、.mc、.md、.me、.mg、.mh、.mk、.ml、.mm、.mn、 .mo、.mp、.mq ...
    • 或 .भारत 或 .భారత్ 或 .мкд
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2010-11-27
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多