1

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

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

www.facebook.com->facebook

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

4

3 回答 3

1

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

您的域可能需要一个静态类成员来保存有效 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 列表的开销。

现在您可能有一个扩展 \My\URI 并允许您将 URI 分解为组件部分的域子类 - 可能有一种方法可以删除 TLD(基于您从 加载到的 TLD 列表parent::$tldListmxr.mozilla.org一次您已经取出了有效的 TLD,它左边(最后一个.和 TLD 之间)应该是域,剩下的任何东西都是子域。

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

于 2013-08-29T16:11:11.033 回答
0

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

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

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

于 2013-08-29T15:48:17.710 回答
0

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

您需要使用Public Suffix List的软件包,只有这样您才能正确提取具有二级、三级 TLD(co.uk、a.bg、b.bg 等)和多级子域的域。

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

$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'
于 2016-07-01T14:42:26.137 回答