我需要一个函数来从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'