53

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

这样做的最佳方法是什么?

4

9 回答 9

110

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
)
于 2008-10-06T21:47:51.620 回答
14

您可以使用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 等域

于 2008-10-06T21:37:03.387 回答
14

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

这是我的尝试:

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

于 2008-10-10T10:20:50.957 回答
3

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

$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);
于 2020-08-19T14:36:18.870 回答
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;
}
于 2011-12-05T16:23:26.697 回答
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 一起使用,因此应该可以在任何地方使用 :)

于 2010-12-04T15:09:34.403 回答
0

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

firstresponder 的正则表达式几乎让我相信这是最好的方法,但它不适用于缺少斜杠的任何内容(例如http://example.com)。我用以下方法解决了这个问题:'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i',但后来我意识到像“ http://example.com/index.htm ”这样的网址匹配两次。哎呀。这不会那么糟糕(只使用第一个),但它也匹配两次这样的东西:' http ://abc.ed.fg.hij.kl.mn/ ',第一个匹配是' t 正确的。:(

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

于 2010-08-24T21:11:07.863 回答
0

提取域部分只有一种正确的方法,它使用公共后缀列表(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'
于 2016-06-27T07:13:19.120 回答
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
于 2020-02-20T19:24:03.730 回答