你如何从PHP中删除一个URL的域名?

我正在寻找一种方法(或function)去掉所有URL的domain.ext部分,这些部分都被送入函数。 域名的扩展名可以是任何东西(.com,.co.uk,.nl,.whatever),并且可以从http://www.domain.com到www.domain.com/path /script.php?=whatever

什么是最好的方式去做这个?

parse_url把一个URL变成一个关联数组:

php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane"; php > $blah = parse_url($foo); php > print_r($blah); Array ( [scheme] => http [host] => www.example.com [path] => /foo/bar [query] => hat=bowler&accessory=cane ) 

你可以使用parse_url()来做到这一点:

 $url = 'http://www.example.com'; $domain = parse_url($url, PHP_URL_HOST); 

在这个例子中,$ domain应该包含example.com。

你也可以写一个正则expression式来得到你想要的。

这是我的尝试:

 $pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i'; $url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane'; if (preg_match($pattern, $url, $matches) === 1) { echo $matches[0]; } 

输出是:

 example.com 

这种模式也考虑到诸如“example.com.au”等域名。

注:我没有咨询相关的RFC。

这里有几个简单的函数来从一个正常或长的域(test.sub.domain.com)或url(http://www.example.com)获取根域(example.com)。;

 /** * Get root domain from full domain * @param string $domain */ public function getRootDomain($domain) { $domain = explode('.', $domain); $tld = array_pop($domain); $name = array_pop($domain); $domain = "$name.$tld"; return $domain; } /** * Get domain name from url * @param string $url */ public function getDomainFromUrl($url) { $domain = parse_url($url, PHP_URL_HOST); $domain = $this->getRootDomain($domain); return $domain; } 

解决了这个…

假设我们调用dev.mysite.com,我们想提取'mysite.com'

 $requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com $thisSite = explode('.', $requestedServerName); // site name now an array array_shift($thisSite); //chop off the first array entry eg 'dev' $thisSite = join('.', $thisSite); //join it back together with dots ;) echo $thisSite; //outputs 'mysite.com' 

与mysite.co.uk一起工作,所以应该到处工作:)

我花了一些时间思考使用正则expression式是否合理,但最终我认为不是。

firstresponder的正则expression式接近说服我这是最好的方法,但它不适用于任何缺less斜线的任何东西(例如http://example.com )。 我解决了以下问题: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i' : '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i' (?= '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i' ,但后来我意识到匹配两次,例如“ http://example.com/index.htm ”。 哎呀。 这不会是那么糟糕(只是使用第一个),但它也匹配了两次这样的事情:' http : //abc.ed.fg.hij.kl.mn/ ',第一场比赛isn'正确的一个。 🙁

一位同事build议只通过parse_url()获取主机,然后只需要最后两个或三个数组位( split() on)。这两个或三个将基于一个域列表'co.uk'等。编制清单变成了难题。

只有一个正确的方法来提取域的部分,它是使用公共后缀列表 (TLD数据库)。 我build议TLDExtract包,这里是示例代码:

 $extract = new LayerShifter\TLDExtract\Extract(); $result = $extract->parse('www.domain.com/path/script.php?=whatever'); $result->getSubdomain(); // will return (string) 'www' $result->getHostname(); // will return (string) 'domain' $result->getSuffix(); // will return (string) 'com'