6

我有一个用户可以输入 URL 的字段。在这种情况下,我需要检查该 URL 是否来自某个域google.com

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

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

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

谢谢。

4

3 回答 3

9

parse_url需要一个有效的 URL 并且google.com/blah无效(从PHP 5.3.3开始)——所以它不起作用。作为一种解决方法,您可以附加httpif 不存在,然后检查域。

使用以下功能:

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)

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

希望这可以帮助!

于 2013-09-09T16:24:51.160 回答
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($url));
?>

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

于 2013-09-09T16:27:48.777 回答
0

parse_url()需要一个有效的 URL。如果它没有方案(即 http:// 位),那么它不是一个有效的 URL。

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

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

现在您的parse_url()通话应该会更好一些。

于 2013-09-09T16:28:30.737 回答