【问题标题】:Checking if the user has entered a domain name or just the base检查用户是否输入了域名或只是基础
【发布时间】:2011-11-23 20:39:24
【问题描述】:

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

但是,我正在尝试做一些其他的事情。我想要它做的事情是检查用户是否只输入了基本 URL 或完整 URL,然后相应地执行一个或多个查询。示例:

如果用户输入“test”,我希望脚本检查 test.com、test.org、test.net 等。 如果用户输入“test.com”,我希望脚本只检查 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. 输出结果

当然,如果已经有脚本可以做到这一点,请告诉我。

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

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

根据各位的回答,我得出的结论是explode函数是用来分隔域名的。但是,遇到多个点会爆炸怎么办?我猜它只会在数组中添加另一个条目,但这会导致问题。因为如果用户随后输入(例如)以 .co.uk 结尾的域,则脚本会将“co”作为 TLD。

在数组中检查超过 2 个字符串也不是一个选项(我认为),因为如果用户然后输入“sub.domain.com”,脚本将“sub”作为基础,“domain.com” ' 作为 TLD。

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

谢谢大家:)

【问题讨论】:

  • Of course, if there's a script that does this already, let me know. 我敢打赌是的
  • 可能,是的,但实际上有数百个脚本,而仅查看我发现的前 10 个脚本对我没有任何帮助。所以我猜问你们是更好的选择,而不是挖掘所有那些试图找到适合我正在寻找的脚本的脚本:P
  • 查看我对第 3 步的回答,不过如果这是您的第一个项目,请选择更容易学习的东西

标签: php whois


【解决方案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吗?

【讨论】:

    【解决方案2】:

    没有算法方法可以找到可以为特定顶级域注册域的最高级别(每个注册机构的政策不同),唯一的方法是创建所有顶级域的列表以及可以注册域的级别。

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

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

    【讨论】:

      【解决方案3】:

      最好的检查方法是遍历所有可能的域扩展,用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 中寻求帮助

      【讨论】:

        【解决方案4】:

        我不确定是否已经存在用于此的脚本,但您提出的解决方案会起作用。

        假设所有 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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-30
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 2011-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多