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)
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)
小智 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)
JMW*_*JMW 10
<?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)
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)
结果:域
作为域名后缀的唯一可靠来源是域名注册商,您无法在他们不知情的情况下找到子域名.在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)
最简单和最快的解决方案。
$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_HOST']);
Run Code Online (Sandbox Code Playgroud)
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)
Mat*_*hew -5
如果您只想要第一个周期之前的内容:
list($sub) = explode('.', 'en.example.com', 2);
Run Code Online (Sandbox Code Playgroud)