检查输入的URL是否来自某个域

时间:2013-09-09 16:17:45

标签: php

我有一个用户可以输入网址的字段。我需要检查该网址是否来自某个域,在本例中为google.com

我已尝试过这个,但是,它并不适用于所有情况(我在下面列出):

if(strstr(parse_url($link, PHP_URL_HOST), 'google.com') { // continue }

如果没有正则表达式,有没有办法做到这一点?如果没有,会怎么做?

感谢。

3 个答案:

答案 0 :(得分:9)

parse_url需要有效的网址,且google.com/blah无效(自PHP 5.3.3起) - 因此无法使用。作为解决方法,如果已经存在,则可以附加http,然后检查域。

使用以下功能:

function checkRootDomain($url) 
{
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
        $url = "http://" . $url;
    }

    $domain = implode('.', array_slice(explode('.', parse_url($url, PHP_URL_HOST)), -2));
    if ($domain == 'google.com') {
        return True;
    } else {
        return False;
    }

}

测试用例:

var_dump(checkRootDomain('http://www.google.com/blah'));
var_dump(checkRootDomain('https://www.google.com/blah '));
var_dump(checkRootDomain('google.com/blah'));
var_dump(checkRootDomain('www.google.com/blah '));

结果:

bool(true) 
bool(true) 
bool(true) 
bool(true)

这是我自己的答案here的修改版本。

希望这有帮助!

答案 1 :(得分:0)

这是版本5.4.7之前的php中的一个问题:http://php.net/manual/en/function.parse-url.php

  

版本5.4.7当省略方案并且存在主要组件分隔符时,修复主机识别。

     

< PHP
  $ url ='//www.example.com/path?googleguy=googley';

     

//在5.4.7之前,这将显示路径为“//www.example.com/path”
  的var_dump(parse_url($网址));
  ?>

您的选择是升级到php> = 5.4.7,或者检测丢失的http:并在缺少时添加它。

答案 2 :(得分:0)

parse_url()需要有效的网址。如果它没有方案(即http://位),则它不是有效的URL。

但是,您可以非常轻松地添加方案。只需检查字符串是否包含冒号(:),如果没有,请在其前面添加http://

if(strpos($link, ':')===false) {$link = "http://".$link;}

现在,您的parse_url()电话会更好一些。