【问题标题】:How do I split a domain name into sld and tld(extension)?如何将域名拆分为 sld 和 tld(扩展名)?
【发布时间】:2012-02-28 20:25:48
【问题描述】:

需要将域作为实际域名返回,并分别返回扩展名

http://www.something.com

应该返回:sld = somethingtld= com

something.co.uk

应该返回:sld = somethingtld= co.uk

我对正则表达式不太熟悉,所以我真的需要一些帮助来处理这个问题。

我想我可以使用parse_url(),然后检查host,但是然后呢?

【问题讨论】:

标签: php regex


【解决方案1】:

将字符串拆分为. 字符(无需正则表达式),然后从末尾开始处理生成的数组。

您需要手动记录哪些 SLD 直接出售给最终用户,因为没有简单的模式可以准确地描述它们。

请记住,可能会有influx of new TLDs

【讨论】:

    【解决方案2】:

    正如您所说,您可以使用$urlCompontents=parseUrl($url) 来获取主机名。然后您可以使用explode(".",$urlCompontents["host"]) 将主机名拆分为不同的部分,例如array("example","co","uk")。您必须通过将零件与列表进行比较来完成其余的工作,因为没有固定的规则,例如“uk”本身不被视为顶级域名,但“co.uk”是。但是这里不需要任何正则表达式。

    【讨论】:

      【解决方案3】:

      以下代码将拆分(分解)'.' 上的主机字符串特点。需要一个简单的 tld 异常数组,我已经将 co.uk 放入其中。并且仅对于这些例外情况,它将使用主机名的最后两个块。

      $h='something.co.uk';
      $x=array('uk'=>'co'); // exceptions of tld's with 2 parts
      $r=explode('.',$h); // split host on dot
      $t=array_pop($r); // create tld
      if(isset($x[$t]) and end($r)==$x[$t]) $t=array_pop($r).'.'.$t; // add to tld for the exceptions
      $d=implode('.',$r); // domain
      echo "sld:$d, tld:$t";
      

      结果是 sld:something, tld:co.uk

      【讨论】:

        【解决方案4】:

        这是我使用的。希望对您有所帮助。

        function extractTLD( $domain )
        {
            $productTLD = '';
            $tempstr = explode(".", $domain);
            unset($tempstr[0]);
            foreach($tempstr as $value){
                $productTLD = $productTLD.".".$value;
            }    
            return $productTLD;
        }
        

        【讨论】:

        • 这写得很糟糕,通过删除域的第一部分,您总是期待一个 www。或其他子域,这不适合 domain.com 格式
        【解决方案5】:
        $pos = strpos('domain.com', '.');
        $length= strlen('domain.com');
        $domain = substr('domain.com', 0, $pos);
        $tld= substr('domain.com', $pos, $length);
        

        【讨论】:

          【解决方案6】:

          使用parse_url($url,PHP_URL_HOST)获取主机名;然后使用下面的函数将域拆分为多个部分:

          function split_domain($host,$SLDs='co|com|edu|gov|mil|net|org')
          {
              $parts=explode('.',$host);
              $index=count($parts)-1;
              if($index>0 && in_array($parts[$index-1],explode('|',$SLDs))) $index--;
              if($index===0) $index++;
              $subdomain=implode('.',array_slice($parts,0,$index-1));
              $domain=$parts[$index-1];
              $tld=implode('.',array_slice($parts,$index));
              return array($subdomain,$domain,$tld);
          }
          

          【讨论】:

            【解决方案7】:

            以防万一有人需要获取有效 TLD 的更新列表: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

            【讨论】:

            • IANA 允许任意数量的第 n 级域(例如 example.co.uk)以及任意数量的子域(例如 abexample)是荒谬的,因为您无法从左或右,没有简单、可靠的方法可以知道域的实际“主要”部分。你可以有“amazon.co, amazon.uk, amazon.co.uk, amazon.com.co.uk”……唯一的办法是有一个脚本来检查域名的实时列表。 :-/
            • 那个列表是错误的,为什么不从publicsuffix.org链接官方列表呢? publicsuffix.org/list/public_suffix_list.dat
            【解决方案8】:

            只需使用PHP Explode Function,限制为两个。

            示例 1:

            var_dump(explode('.','example.com',2));
            

            示例 1 结果:

            array(2) { [0]=> string(7) "example" [1]=> string(3) "com" }
            

            示例 2:

            var_dump(explode('.','example.uk.com',2));
            

            示例 2 结果:

            array(2) { [0]=> string(7) "example" [1]=> string(6) "uk.com" }
            

            【讨论】:

              猜你喜欢
              • 2012-12-19
              • 2018-09-01
              • 2011-05-31
              • 1970-01-01
              • 2011-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多