PHP函数来获取URL的子域

Dam*_*ano 104 php subdomain

PHP中是否有一个函数来获取子域名?

在以下示例中,我想获取URL的"en"部分:

en.example.com
Run Code Online (Sandbox Code Playgroud)

Mic*_*eal 125

这是一个单行解决方案:

array_shift((explode('.', $_SERVER['HTTP_HOST'])));
Run Code Online (Sandbox Code Playgroud)

或者使用你的例子:

array_shift((explode('.', 'en.example.com')));
Run Code Online (Sandbox Code Playgroud)

编辑:通过添加双括号修复"仅通过引用传递变量".


编辑2:从PHP 5.4开始,你可以简单地做:

explode('.', 'en.example.com')[0];
Run Code Online (Sandbox Code Playgroud)

  • 只应通过引用传递变量. (16认同)
  • 这些天你不能只做`爆炸(...)[0]`而不是使用轮班?几年没有PHPing .. (8认同)
  • 如果有人输入“ www.en.example.com”,该解决方案将无法正常工作,因此会将“ www”作为子域返回。 (3认同)

Mik*_*wis 62

使用parse_url函数.

$url = 'http://en.example.com';

$parsedUrl = parse_url($url);

$host = explode('.', $parsedUrl['host']);

$subdomain = $host[0];
echo $subdomain;
Run Code Online (Sandbox Code Playgroud)

对于多个子域

$url = 'http://usa.en.example.com';

$parsedUrl = parse_url($url);

$host = explode('.', $parsedUrl['host']);

$subdomains = array_slice($host, 0, count($host) - 2 );
print_r($subdomains);
Run Code Online (Sandbox Code Playgroud)

  • 这适用于具有单个"单词"TLD的所有内容,如net,com,biz等.但是,当处理co.uk时,例如,它没有.正如[这里]所见(http://stackoverflow.com/questions/288810/get-the-subdomain-from-a-url)这实际上是一个难以解决的问题. (4认同)
  • 如果根本没有子域,这也会失败. (2认同)

小智 32

您可以通过首先获取域名(例如sub.example.com => example.co.uk)然后使用strstr获取子域来完成此操作.

$testArray = array(
    'sub1.sub2.example.co.uk',
    'sub1.example.com',
    'example.com',
    'sub1.sub2.sub3.example.co.uk',
    'sub1.sub2.sub3.example.com',
    'sub1.sub2.example.com'
);

foreach($testArray as $k => $v)
{
    echo $k." => ".extract_subdomains($v)."\n";
}

function extract_domain($domain)
{
    if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches))
    {
        return $matches['domain'];
    } else {
        return $domain;
    }
}

function extract_subdomains($domain)
{
    $subdomains = $domain;
    $domain = extract_domain($subdomains);

    $subdomains = rtrim(strstr($subdomains, $domain, true), '.');

    return $subdomains;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0 => sub1.sub2
1 => sub1
2 =>
3 => sub1.sub2.sub3
4 => sub1.sub2.sub3
5 => sub1.sub2
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是最好的解决方案,因为它还允许没有子域的域,而不是将域名重新作为子域作为第一个点之前的部分.对于检查子域的存在非常有用. (2认同)
  • 尽管此解决方案非常简洁,并且在几乎所有情况下都可以使用,但是请注意,域名可能包含6个以上的字符,例如pvt.k12.ma.us,health.vn甚至k12.ak .us`。另外,域名可能使用中文或俄语字符集,因此正则表达式的部分[[az \。] {2,6}`与它们不匹配。在此处签出示例域名:https://publicsuffix.org/list/ (2认同)

JMW*_*JMW 10

http://php.net/parse_url

<?php
  $url = 'http://user:password@sub.hostname.tld/path?argument=value#anchor';
  $array=parse_url($url);
  $array['host']=explode('.', $array['host']);

  echo $array['host'][0]; // returns 'en'
?>
Run Code Online (Sandbox Code Playgroud)


Jea*_*yle 7

PHP 7.0:使用爆炸函数并创建所有结果的列表。

list($subdomain,$host) = explode('.', $_SERVER["SERVER_NAME"]);
Run Code Online (Sandbox Code Playgroud)

示例:sub.domain.com

echo $subdomain; 
Run Code Online (Sandbox Code Playgroud)

结果:

echo $host;
Run Code Online (Sandbox Code Playgroud)

结果:

  • 您忘记了 TLD,例如“.co.uk” - 您的代码段将不适用于这些 TLD (3认同)

Sas*_*ken 6

作为域名后缀的唯一可靠来源是域名注册商,您无法在他们不知情的情况下找到子域名.在https://publicsuffix.org上有一个包含所有域后缀的列表.该站点还链接到PHP库:https://github.com/jeremykendall/php-domain-parser.

请在下面找到一个例子.我还为en.test.co.uk添加了样本,这是一个带有多后缀(co.uk)的域.

<?php

require_once 'vendor/autoload.php';

$pslManager = new Pdp\PublicSuffixListManager();
$parser = new Pdp\Parser($pslManager->getList());
$host = 'http://en.example.com';
$url = $parser->parseUrl($host);

echo $url->host->subdomain;


$host = 'http://en.test.co.uk';
$url = $parser->parseUrl($host);

echo $url->host->subdomain;
Run Code Online (Sandbox Code Playgroud)


use*_*256 5

最简单和最快的解决方案。

$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_HOST']);
Run Code Online (Sandbox Code Playgroud)


Kam*_*her 5

只是...

    preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $url, $match);
Run Code Online (Sandbox Code Playgroud)

只需阅读$ match [1]

工作实例

此网址列表非常适合

$url = array(
    'http://www.domain.com', // www
    'http://domain.com', // --nothing--
    'https://domain.com', // --nothing--
    'www.domain.com', // www
    'domain.com', // --nothing--
    'www.domain.com/some/path', // www
    'http://sub.domain.com/domain.com', // sub
    '???????????????.????????.ua', // ??????????????? ;)
    '????????.ua', // --nothing--
    'http://sub-domain.domain.net/domain.net', // sub-domain
    'sub-domain.third-Level_DomaIN.domain.uk.co/domain.net' // sub-domain
);

foreach ($url as $u) {
    preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $u, $match);
    var_dump($match);
}
Run Code Online (Sandbox Code Playgroud)

  • 关于俄语,谷歌将俄语翻译为英语,以“已发布的价值观”回来(以防有人像我一样好奇) (3认同)
  • PS-我不知道俄语文字写的是什么。只是从* ru.wikipedia.org *中拿了一些随便的话;) (2认同)

Mat*_*hew -5

如果您只想要第一个周期之前的内容:

list($sub) = explode('.', 'en.example.com', 2);
Run Code Online (Sandbox Code Playgroud)