你如何从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'