检查用户是输入了域名还是仅输入了基础

时间:2011-11-23 20:39:25

标签: php whois

我想创建一个执行WHOIS查询的内容,以查看域是否可用。现在,我已经找到了相当多的现成脚本,但它们似乎都是相同的,因为你需要指定基础,然后选择你想要的扩展,它会做到这一点(例如,输入'test',检查.com,它将检查test.com是否可用)

然而,我正试图做一些其他事情。我想要它做的是检查用户是仅输入了基本URL还是完整的URL,然后相应地进行一个或多个查询。例如:

如果用户输入'test',我希望脚本检查test.com,test.org,test.net等。 如果用户输入'test.com',我希望脚本检查JUST for test.com。

我真的不知道要建立什么,但Mike Nott's PHP Whois Script看起来没问题。当然,建议随时欢迎。

现在我猜测脚本流应该是这样的:

  1. 用户输入查询
  2. 脚本检查空格
  3. 脚本检查用户是否只输入了基本域名或完整域名(我猜测的方法是检查那里是否有点)
  4. 如果用户输入了完整的域名,请将基础和TLD分开并将它们存储在变量中并将“状态”存储在某处($ full = true / false)
  5. if($ full = true){检查$ base.com $ base.net等对应的whois服务器};
  6. if($ full!= true){查看$ tld的正确服务器是什么,并检查一个$ base。$ tld}
  7. 输出结果
  8. 当然,如果有一个脚本已经这样做了,请告诉我。

    编辑:只是你知道,我可以做简单的if语句等,但我的“工作流程”中的第3,4,5和6步是我无法弄清楚的部分

    编辑2:感谢您的所有答案,伙计们!马库斯·亚当的理论确实有效。我的域名经销商(我从中获取域名的人)不提供像.co.uk这样的二级域顶级域名,所以这不是问题。他们也不支持IDN。

    从你们的答案中,我得出结论,爆炸功能用于分隔域名。但是,当它遇到多个点时会发生什么?我猜它只会在数组中添加另一个条目,但这会导致问题。因为如果用户然后输入(例如)以.co.uk结尾的域,该脚本将以'co'作为TLD。

    检查数组中超过2个字符串也不是一个选项(我认为),因为如果用户输入'sub.domain.com',脚本将以'sub'为基础和'domain.com '作为顶级域名。

    另外,Marcus Adams,你说如果whois服务器显示'可用',那不能保证它可用,我必须查询注册商。但是我该怎么做呢?有什么想法吗?

    谢谢你们:)

4 个答案:

答案 0 :(得分:1)

我已经实现了这样的代码,但不是在PHP中。这是我学到的。

算法

要小心,因为某些域可以拥有第一级和第二级顶级域。例如example.inexample.co.in

我建议首先修剪前导和尾随空格的域并将它们转换为小写。

由于许多TLD都有自己的whois服务器,因此您也可以创建一个包含每个可能TLD的表或数组,当然是小写。

然后,检查是否有一段时间。如果没有时期,那就没有什么可做的。

如果有一段时间,则必须提取TLD。从左侧开始,找到第一个时期。在那里拆分字符串。如果右侧与列表中的某个TLD匹配,则左侧的所有内容均为名称,右侧的所有内容均为TLD。如果没有TLD匹配,则转到下一个时段并重复,直到找到匹配或用完时段。

如果找不到匹配项,则表示他们未输入有效域名。您可以尝试在右侧的最后一个时段进行拆分,因为他们可能会输入www.wiki.example

如果找到匹配项,您仍然需要查看拆分左侧是否有另一个句点,并在那里修剪或认为它无效。

查找whois服务器

IANA提供有关每个TLD的基本信息,包括whois服务器。

Root Zone Database

请注意,您可能正在创建正则表达式来评估每个whois服务器的结果,因为结果未标准化。

Whois数据库与注册商数据库不同

您不能仅仅因为whois服务器报告它“可用”而依赖可用的域。在大多数情况下,它是准确的,但不向用户做出任何可以注册的承诺。您必须向注册商查询域名是否可用。

最值得注意的例外是即将删除某个域。有一段时间,whois服务器将没有记录,但尚未从注册商处发布。

国际化域名

您打算支持IDNs吗?

答案 1 :(得分:1)

没有算法方法可以找到可以为特定顶级域注册域的最高级别(策略因每个注册表而异),唯一的方法是创建所有顶级域的列表以及域名注册的级别。

这是Public Suffix List退出的主要原因。

使用此列表中收集的定义,您可以轻松地将域名解析为其部分,提取TLD,域和子域。

答案 2 :(得分:0)

检查的最佳方法是遍历所有可能的域扩展,使用explode拆分字符串,然后检查点后面的内容。

这是针对第3步& 4:

function isFullDomain($domain){
    $domain=explode('.', $domain);
    foreach($possibleDomainExts as $ext){
        if($ext==$domain[count($domain)-1) return $ext;
    }
    return false;
}

这样称呼:

if(!$ext=isFullDomain($domain)){
    //is only the base
}
else{
    //is the full domain and $ext will hold the value of the domain extension
}

您已经拥有了PHP whois脚本,因此请将其拆分以获取可能的域列表,并获取有关步骤5&的帮助。 6

答案 3 :(得分:0)

我不确定脚本是否已存在,但您提出的解决方案是可行的。

假设所有whois查找逻辑都在一个名为check_whois($base, $tld)的方法中,解决方案可能如下所示:

$pieces = explode(".", $user_input);
$base = $pieces[0];
$tld = $pieces[1];
if ($tld == null) {
  $default_tlds = array("com","net","org");
  foreach( $default_tlds as $tld ) {
    check_whois($base, $tld);
  }
} else {
  check_whois($base, $tld);
}