我很感激能为这件事提供任何帮助。
我正在创建一个注册表单,一个字段用于用户域,我将验证该字段对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(我不知道常见的域名扩展名)。
有没有人比上述功能更了解一种方法?
答案 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提到的解决方案。