检查URL是否来自某个网​​站

时间:2013-09-07 21:27:57

标签: php regex url

问题

用户可以提交表单,他可以提交指向sitea.com的链接。现在我要做的是检查用户是否实际提交了来自sitea.com

的网址

我尝试了什么

我尝试检查网址是否正确(使用正则表达式),并包含sitea.com。但这包含差距,因为任何人都可以将?haha=sitea.com添加到网址并仍然匹配。并且'因为我不是正则表达式的主人,我的“解决方案”在这里结束。

我的问题

是否可以检查$_POST['url']是否实际上是sitea.com的链接?

2 个答案:

答案 0 :(得分:6)

我认为这里最好parse_url()。正则表达式可能有效,但最好在内置函数可用时避免使用正则表达式。

我会做类似的事情:

$url = '...';
$domain = implode('.', array_slice(explode('.', parse_url($url, PHP_URL_HOST)), -2));

if ($domain == 'sitea.com') {
    # code...
}

作为一项功能:

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

}

测试用例:

var_dump(getDomain('http://sitea.com/'));
var_dump(getDomain('http://sitea.com/directory'));
var_dump(getDomain('http://subdomain.sitea.com/'));
var_dump(getDomain('http://sub.subdomain.sitea.com/#test'));

var_dump(getDomain('http://subdomain.notsitea.com/#dsdf'));
var_dump(getDomain('http://sitea.somesite.com'));
var_dump(getDomain('http://example.com/sitea.com'));
var_dump(getDomain('http://sitea.example.com/test.php?haha=sitea.com'));

输出:

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

bool(false)
bool(false)
bool(false)
bool(false)

Demo!

答案 1 :(得分:3)

这可能不是正则表达式的工作,而是适用于您选择的语言的现有工具。正则表达不是一个魔术棒,您可以在遇到涉及字符串的每个问题上挥手。您可能希望使用已编写,测试和调试的现有代码。

在PHP中,使用parse_url函数。

Perl:URI module

Ruby:URI module

.NET:'Uri' class