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

时间:2008-10-06 21:31:27

标签: php urlparse

我正在寻找一种方法(或函数)去掉任何提供给函数的URL的domain.ext部分。域扩展名可以是任何内容(.com,.co.uk,.nl,.whatever),并且提供给它的URL可以是从http://www.domain.com到www.domain.com/path/script.php的任何内容。 ?=任何

最好的办法是什么?

9 个答案:

答案 0 :(得分:90)

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

答案 1 :(得分:11)

您可以使用parse_url()执行此操作:

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

在此示例中,$ domain应包含example.com,无论它是否具有www。它也适用于.co.uk等域名。

答案 2 :(得分:10)

您还可以编写正则表达式以获得您想要的内容。

以下是我的尝试:

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

答案 3 :(得分:2)

以下是一些简单的函数,用于从普通域或长域(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;
}

答案 4 :(得分:1)

解决了这个......

假设我们正在调用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,所以应该在任何地方工作:)

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

firstresponder的正则表达式接近说服我这是最好的方法,但它对任何缺少尾部斜线的东西都没有用(例如http://example.com)。我使用以下内容修复了此问题:'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i',但后来我意识到匹配两次,例如“http://example.com/index.htm”。哎呀。这不会那么糟糕(只使用第一个),但它也匹配两次:'http://abc.ed.fg.hij.kl.mn/',第一场比赛不正确。 :(

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

答案 7 :(得分:0)

只有一种正确的方法来提取域名部分,它使用Public Suffix List(TLD数据库)。我推荐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'

答案 8 :(得分:0)

此功能应该起作用:

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