如何在php中从URL中去掉域名?

如何在php中从URL中去掉域名?,php,urlparse,Php,Urlparse,我正在寻找一种方法(或函数)来去除输入函数的任何URL的domain.ext部分。域扩展可以是任何内容(.com、.co.uk、.nl、.whatever),输入到它的URL可以是从到www.domain.com/path/script.php?=任何内容 做这件事最好的方法是什么?您可以使用以下方法: $url = 'http://www.example.com'; $domain = parse_url($url, PHP_URL_HOST); $domain = str_replace('

我正在寻找一种方法(或函数)来去除输入函数的任何URL的domain.ext部分。域扩展可以是任何内容(.com、.co.uk、.nl、.whatever),输入到它的URL可以是从到www.domain.com/path/script.php?=任何内容

做这件事最好的方法是什么?

您可以使用以下方法:

$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_HOST);
$domain = str_replace('www.','',$domain);
在本例中,$domain应该包含example.com,而不管它是否有www。它也适用于域,如.co.uk

将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
)

您还可以编写正则表达式以获得所需的结果

以下是我的尝试:

$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。

我花了一些时间考虑使用正则表达式是否有意义,但最后我认为没有

firstresponder的regexp几乎让我相信这是最好的方法,但它对任何缺少尾部斜杠的东西都不起作用(例如,就是这样)。我用下面的代码修复了这个问题:
'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\w])/I'
,但后来我意识到类似于“”的URL匹配了两次。哎呀。这不会太糟糕(只需使用第一个),但它也会在类似以下内容上匹配两次:“”,并且第一个匹配不正确:(

一位同事建议只获取主机(通过
parse_url()
),然后只获取最后的两个或三个数组位(
split()
)。这两个或三个数组位将基于一个域列表,如“co.uk”等。组成该列表成为困难的部分。

解决了这个问题

假设我们打电话给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,因此应该适用于所有地方:)

这里有几个简单的函数,可以从普通或长域(test.sub.domain.com)或url获取根域(example.com)(http://www.example.com)


提取域部分只有一种正确的方法,那就是使用(TLD数据库)。我推荐包,下面是示例代码:

$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'

该功能应在以下情况下发挥作用:

function Delete_Domain_From_Url($Url = false)
{
    if($Url)
    {
        $Url_Parts = parse_url($Url);
        $Url = isset($Url_Parts['path']) ? $Url_Parts['path'] : '';
        $Url .= isset($Url_Parts['query']) ? "?".$Url_Parts['query'] : '';
    }

    return $Url;
}
要使用它:

$Url = "https://stackoverflow.com/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php";
echo Delete_Domain_From_Url($Url);

# Output: 
#/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php

以下代码将从绝对URL修剪协议、域和端口:

$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);

这不应该是parse_url()而不是url_parse()注意:parse_url的第二个参数是PHP5发明的。PHP4上的任何人(为了上帝的爱,请升级…)都需要使用Robert Elwell的方式。PHP4上的任何人。。。必须升级。$domain包含www.example.com。如果www.部分存在于域中,那么最好的方法是什么。我不擅长正则表达式。我能想到的混乱的方式是$www_check=substr($domain,0,4);if($www_check==“www.”){echo substr($domain,4);}else{echo$domain;}@Yegor:$domain=preg_replace('/^www./','$domain);我喜欢在“www”上爆炸,然后自己使用数组中的第一个实例。它通常工作正常。小心,因为很多URL前面没有www。ie images.google.com是的,一般来说,这是我的目标,因为一个非www子域可以提供关于站点该部分显示内容的信息。这是覆盖所有情况的最佳解决方案。ThanksCan我在另一种语言中使用此正则表达式模式?除非您也有子域,否则不适用于由两部分组成的TLD<代码>www.mydomain.co.uk//输出'mydomain.co.uk'mydomain.co.uk//输出co.uk可能重复的
$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);