2

我想知道在 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但也可以接受 simple foo,因为它转换为http://foo. 然而,虽然这不是一个有效的公共网址,但我认为......那你有什么建议?回到传统的正则表达式?

4

2 回答 2

3

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

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

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

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

于 2015-08-20T08:31:02.013 回答
0

用这个

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

?>
于 2015-08-20T09:26:16.943 回答