PHP - 允许域,而不是子域

时间:2011-09-12 01:45:51

标签: php validation dns

我很感激能为这件事提供任何帮助。

我正在创建一个注册表单,一个字段用于用户域,我将验证该字段对FILTER_VALIDATE_URL有效,并且该字段与dns_check_record一致。

然而,我遇到的一个问题是,使用这两种方法也会允许子域名提交到我不想要的表单。

有没有人知道允许域而不是子域的方法?

我已经从http://syntax.cwarn23.net/PHP/Strip_URL_to_Domain

测试了以下功能
function domain($domainb)
{
$bits = explode('/', $domainb);
if ($bits[0]=='http:' || $bits[0]=='https:')
    {
    $domainb= $bits[2];
    } else {
    $domainb= $bits[0];
    }
unset($bits);
$bits = explode('.', $domainb);
$idz=count($bits);
$idz-=3;
if (strlen($bits[($idz+2)])==2) {
$url=$bits[$idz].'.'.$bits[($idz+1)].'.'.$bits[($idz+2)];
} else if (strlen($bits[($idz+2)])==0) {
$url=$bits[($idz)].'.'.$bits[($idz+1)];
} else {
$url=$bits[($idz+1)].'.'.$bits[($idz+2)];
}
return $url;

然而,这并不完美,因为任何域名(如www.domain.uk.com)都将显示为uk.com(我不知道常见的域名扩展名)。

有没有人比上述功能更了解一种方法?

3 个答案:

答案 0 :(得分:0)

正如Micheal Mior指出的那样,你必须检查 .co.uk .com.br 以及其他许多人。

一些浏览器供应商正在维护一份有效TLD的非TLD列表:http://publicsuffix.org/。列表为 quite huge

有一个库here使用这个有效的TLD列表来实现您正在寻找的功能(下载是here)。 (通过https://wiki.mozilla.org/Gecko:Effective_TLD_Service找到。)

答案 1 :(得分:0)

结合它们。

dns_check_record将在'.co.uk'上失败,因此您可以在点上拆分字符串,检查组合后两部分时获得的域名,如果失败,请使用第三部分如果有的话。

您将对无效域进行双重检查,但我认为这不是问题。

答案 2 :(得分:0)

首先,您可以使用parse_url()仅获取主机名:http://www.stackoverflow.com - > $ url ['host'] ='www.stackoverflow.com'

其次,您可以计算主机名中的点数:explode() - > count()或substr_count()

主机是否存在超过1分的子域名。

现在您可以使用GolezTrol或arnaud576875提到的解决方案。