我需要一个函数来从 URL 中提取名称。
像这样当输入是www.google.com
我希望输出是google
。
www.facebook.com
->facebook
经过几次搜索后,我找到了这个parse_url($url, PHP_URL_HOST);
函数当我输入这个函数时,www.google.com/blahblah/blahblah
我得到的输出为www.google.com
我需要一个函数来从 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 的子集 - 从技术上讲,我创建了 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::$tldList
)mxr.mozilla.org
一次您已经取出了有效的 TLD,它左边(最后一个.
和 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() 不是您的解决方案。
您需要使用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'