仅从PHP中的URL解析域名


Parsing Domain Name only from URL In PHP

我需要一个函数来从URL中提取名称。

像这样,当输入是www.google.com时,我希望输出是google

www.facebook.com->facebook

经过几次搜索,我找到了这个函数parse_url($url, PHP_URL_HOST);有了这个函数,当我输入www.google.com/blahblah/blahblah时,我得到的输出为www.google.com

我认为只有一种可靠的方法可以做到这一点,您需要为它创建一个类;就我个人而言,我使用类似namespace'Domain extends namespace'URI的东西——域,本质上是URI的子集——从技术上讲,我创建了两个类。

您的域可能需要一个静态类成员来保存有效TLD的列表,这也可能存在于URI类中,因为您可能希望将其与其他子类一起重用。

namespace My;
class URI {
  protected static $tldList;
  private static $_tldRepository = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
  protected $uri;
  public function __construct($sURI = "") {
    if(!self::$tldList) {
      //static method to load the TLD list from Mozilla
      //  and parse it into an array, which sets self::$tldList
      self::loadTLDList();
    }
  //if the URI has been passed in - set it
  if($sURI) $this->setURI($sURI);
  }
  public function setURI($sURI) {
    $this->uri = $sURI; //needs validation and sanity checks of course
  }
  public function getURI() {
    return $this->uri;
  }

  //other methods ...
}

事实上,我实际上将TLD列表复制到服务器上的一个文件中并使用它,并且每6个月才更新一次,以避免在任何页面上首次创建URI对象时读取完整TLD列表的开销。

现在,您可能有一个Domain子类,它扩展了''My''URI,并允许您将URI分解为多个组成部分-一旦您取出有效的TLD(位于最后一个.和TLD之间),可能会有一种方法来删除TLD(基于您从mxr.mozilla.org加载到parent::$tldList的TLD列表),剩下的任何东西都将是子域。

您也可以根据需要使用提取数据的方法。

尽管我同意关于剥离TLD 的评论,但这确实符合您的要求

preg_match("/([^'.'/]+)'.[a-z'.]{2,6}$/i", "http://www.google.com", $match);
echo $match[1];

它基本上与TLD之前的部分相匹配。我相信RFC规定最长的公共TLD可以是6个字符。TLD部分不是傻瓜式的,但它适用于大多数输入。

Regex和parse_url()不是您的解决方案。

您需要使用公共后缀列表的包,只有这样您才能正确提取具有两级、三级TLD(co.uk、a.bg、b.bg等)和多级子域的域。

我建议使用TLD提取物。这里的代码示例:

$extract = new LayerShifter'TLDExtract'Extract();
$result = $extract->parse('www.google.com/blahblah/blahblah');
$result->getHostname(); // will return (string) 'google'
$result->getRegistrableDomain(); // will return (string) 'google.com'