我有一个用户可以输入网址的字段。我需要检查该网址是否来自某个域,在本例中为google.com
。
我已尝试过这个,但是,它并不适用于所有情况(我在下面列出):
if(strstr(parse_url($link, PHP_URL_HOST), 'google.com') { // continue }
如果没有正则表达式,有没有办法做到这一点?如果没有,会怎么做?
感谢。
答案 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()
电话会更好一些。