【问题标题】:Extract top domain from string php从字符串 php 中提取顶级域
【发布时间】:2013-02-07 07:01:23
【问题描述】:

我需要从可以是任何字符串的字符串中提取域名。如:

$sitelink="http://www.somewebsite.com/product/3749875/info/overview.html";

$sitelink="http://subdomain.somewebsite.com/blah/blah/whatever.php";

无论如何,我希望提取“somewebsite.com”部分(可以是任何内容),然后丢弃其余部分。

【问题讨论】:

标签: php string


【解决方案1】:

parse_url($url)

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));
?>

The above example will output:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

使用这些值

echo parse_url($url, PHP_URL_HOST); //hostname

$url_info = parse_url($url);
echo $url_info['host'];//hostname

【讨论】:

  • 我觉得OP只想要二级域名
  • 我让 OP 弄清楚如何使用数组。
  • 好的,这看起来很有希望。如何仅使用数组的主机部分将“主机”部分转换为字符串并忽略其余部分?谢谢
  • 该手册的链接是帖子。但我添加了您如何访问这些值
【解决方案2】:

在这里

<?php

$sitelink="http://www.somewebsite.com/product/3749875/info/overview.html";

$domain_pieces = explode(".", parse_url($sitelink, PHP_URL_HOST));

$l = sizeof($domain_pieces);

$secondleveldomain = $domain_pieces[$l-2] . "." . $domain_pieces[$l-1];

echo $secondleveldomain;

请注意,这可能不是您正在寻找的行为,因为对于像这样的主机

stackoverflow.co.uk

它会回显“co.uk”


见:

http://publicsuffix.org/learn/

http://www.dkim-reputation.org/regdom-libs/

http://www.dkim-reputation.org/regdom-lib-downloads/

【讨论】:

  • 您好,感谢您的留言。你是对的,在这种情况下呼应 .co.uk 不会有帮助。如果可能,它需要能够处理任何域(和剥离子域)。无论如何,谢谢
  • 您可以将此表作为参考wiki.mozilla.org/TLD_List 来构建您需要的内容
【解决方案3】:

您需要使用Public Suffix List 的软件包,只有这样您才能正确提取具有二级、三级TLD(co.uk、a.bg、b.bg 等)和多级子域的域。正则表达式、parse_url() 或字符串函数永远不会产生绝对正确的结果。

我建议使用TLD Extract。这里的代码示例:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('http://www.somewebsite.com/product/3749875/info/overview.html');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'somewebsite'
$result->getSuffix(); // will return (string) 'com'
$result->getRegistrableDomain(); // will return (string) 'somewebsite.com'

【讨论】:

    【解决方案4】:

    2个复杂的url

    $url="https://www.example.co.uk/page/section/younameit";
    or
    $url="https://example.co.uk/page/section/younameit";
    

    获取“www.example.co.uk”:

    $host=parse_url($url, PHP_URL_HOST);
    

    仅获取“example.co.uk”

    $parts = explode('www.',$host);
    $domain = $parts[1];
    
    // ...or...
    
    $domain = ltrim($host, 'www.')
    

    如果您的网址包含“www”。或不会得到相同的最终结果,即“example.co.uk”

    瞧!

    【讨论】:

      【解决方案5】:

      对于可以是任何东西的字符串,新方法:

      function extract_plain_domain($text) {
      
          $text=trim($text,"/");
          $text=strtolower($text);
      
          $parts=explode("/",$text);
          if (substr_count($parts[0],"http")) {
              $parts[0]="";
          }
          reset ($parts);while (list ($key, $val) = each ($parts)) {
                  if (!empty($val)) { $text=$val; break; }
          }
      
          $parts=explode(".",$text);
          if (empty($parts[2])) {
              return $parts[0].".".$parts[1];
              } else {
              $num_parts=count($parts);
              return $parts[$num_parts-2].".".$parts[$num_parts-1];
              }
      
      } // end function extract_plain_domain
      

      【讨论】:

        【解决方案6】:

        您可以使用 Utopia Domains 库 (https://github.com/utopia-php/domains),它将根据 Mozilla 公共后缀列表 (https://publicsuffix.org) 返回域 TLD 和公共后缀,它可以用作当前存档的 TLDExtract 包的替代品.

        您可以使用 'parse_url' 函数从您的 URL 中获取主机名,然后使用 Utopia Domains 解析器获取正确的 TLD 并将其与域名一起加入:

        <?php
        
        require_once './vendor/autoload.php';
        
        use Utopia\Domains\Domain;
        
        $url = 'http://demo.example.co.uk/site';
        
        $domain = new Domain(parse_url($url, PHP_URL_HOST)); // demo.example.co.uk
        
        var_dump($domain->get()); // demo.example.co.uk
        var_dump($domain->getTLD()); // uk
        var_dump($domain->getSuffix()); // co.uk
        var_dump($domain->getName()); // example
        var_dump($domain->getSub()); // demo
        var_dump($domain->isKnown()); // true
        var_dump($domain->isICANN()); // true
        var_dump($domain->isPrivate()); // false
        var_dump($domain->isTest()); // false
        
        var_dump($domain->getName().'.'.$domain->getSuffix()); // example.co.uk
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2022-11-09
          • 2014-06-24
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多