PHPにサブドメインの名前を取得する関数はありますか?
次の例では、URLの「en」の部分を取得します。
en.example.com
(^|://)(.*)\.
キャプチャできません.*
か?私はどちらかと言えばphpとregexを吸うのですが、これは頭に浮かびます。
en.foo.bar.example.com
かen.example.co.uk
?
PHPにサブドメインの名前を取得する関数はありますか?
次の例では、URLの「en」の部分を取得します。
en.example.com
(^|://)(.*)\.
キャプチャできません.*
か?私はどちらかと言えばphpとregexを吸うのですが、これは頭に浮かびます。
en.foo.bar.example.com
かen.example.co.uk
?
回答:
これが1行のソリューションです。
array_shift((explode('.', $_SERVER['HTTP_HOST'])));
またはあなたの例を使用して:
array_shift((explode('.', 'en.example.com')));
編集:二重括弧を追加することにより、「変数のみを参照で渡す必要がある」を修正しました。
編集2:PHP 5.4から、あなたは簡単に行うことができます:
explode('.', 'en.example.com')[0];
explode(...)[0]
最近シフトを使う代わりにあなただけでできるのではないですか?数年前からではないとなってPHPing ...
Strict Standards: Only variables should be passed by reference.
www.en.example.com
戻る場合には機能しませんwww
。
parse_url関数を使用します。
$url = 'http://en.example.com';
$parsedUrl = parse_url($url);
$host = explode('.', $parsedUrl['host']);
$subdomain = $host[0];
echo $subdomain;
複数のサブドメインの場合
$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);
これを行うには、まずドメイン名(例: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;
}
出力:
0 => sub1.sub2
1 => sub1
2 =>
3 => sub1.sub2.sub3
4 => sub1.sub2.sub3
5 => sub1.sub2
for
ループで取得することで独自のソリューションを作成していましたが、それらの長さ(それらが「co.uk」のようなドメインの一部でした)。実際、あなたの解決策は私がやっていたことよりもはるかに単純です。正規表現は命を救う、ありがとう!
pvt.k12.ma.us
に6文字を超える文字が含まれる場合があることに注意しhealth.vn
てくださいk12.ak.us
。また、ドメイン名は中国語またはロシア語の文字セットを使用している可能性があるため、正規表現の部分[a-z\.]{2,6}
はそれらに一致しません。ここでドメイン名の例を確認してください:publicsuffix.org/list
<?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'
?>
ドメインサフィックスの唯一の信頼できるソースはドメインレジストラーであるため、サブドメインを知らずに見つけることはできません。https://publicsuffix.orgにすべてのドメインサフィックスのリストがあります。このサイトはPHPライブラリにもリンクしています:https : //github.com/jeremykendall/php-domain-parser。
以下の例をご覧ください。また、マルチサフィックス(co.uk)のドメインであるen.test.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;
preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $url, $match);
$ match [1]を読んでください
それはこのURLのリストで完全に動作します
$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);
}
.ua
ウクライナの国コードです。
$match[1]
パーツを入手する方法はありますか?$match[0]
必要ないようです。
$REFERRER = $_SERVER['HTTP_REFERER']; // Or other method to get a URL for decomposition
$domain = substr($REFERRER, strpos($REFERRER, '://')+3);
$domain = substr($domain, 0, strpos($domain, '/'));
// This line will return 'en' of 'en.example.com'
$subdomain = substr($domain, 0, strpos($domain, '.'));
$_SERVER['HTTP_HOST']
)を自動検出して、なりすまし可能なリファラーヘッダーに依存するより良い方法があります。
PHP 7.0:関数explodeを使用して、すべての結果のリストを作成します。
list($subdomain,$host) = explode('.', $_SERVER["SERVER_NAME"]);
例:sub.domain.com
echo $subdomain;
結果:サブ
echo $host;
結果:ドメイン
.co.uk
-スニペットはこれらのTLDでは機能しません
私が最良かつ短い解決策を見つけたのは
array_shift(explode(".",$_SERVER['HTTP_HOST']));
「エラー:厳密な標準:変数のみを参照渡しする必要があります」が表示される場合。このように使用します:
$env = (explode(".",$_SERVER['HTTP_HOST']));
$env = array_shift($env);
$domain = 'sub.dev.example.com';
$tmp = explode('.', $domain); // split into parts
$subdomain = current($tmp);
print($subdomain); // prints "sub"
前の質問で見たように: PHPで最初のサブドメインを取得する方法は?
100%動的な解決策は実際にはありません-私もそれを理解しようとしているだけで、異なるドメイン拡張(DTL)のために、これらの拡張をすべて解析して毎回チェックしなければ、このタスクは非常に困難になります。
.com vs .co.uk vs org.uk
最も信頼できるオプションは、実際のドメイン名を格納する定数(またはデータベースエントリなど)を定義し、$_SERVER['SERVER_NAME']
使用から削除することです。substr()
defined("DOMAIN")
|| define("DOMAIN", 'mymaindomain.co.uk');
function getSubDomain() {
if (empty($_SERVER['SERVER_NAME'])) {
return null;
}
$subDomain = substr($_SERVER['SERVER_NAME'], 0, -(strlen(DOMAIN)));
if (empty($subDomain)) {
return null;
}
return rtrim($subDomain, '.');
}
ここで、この関数を使用しhttp://test.mymaindomain.co.uk
ている場合、test
または複数のサブドメインレベルがあるhttp://another.test.mymaindomain.co.uk
場合は、それが表示されますanother.test
-もちろん、を更新しない限りDOMAIN
。
これがお役に立てば幸いです。
正規表現、文字列関数、parse_url()またはそれらの組み合わせを使用することは、実際の解決策ではありません。提案されたソリューションのいずれかをdomain test.en.example.co.uk
でテストするだけで、正しい結果は得られません。
正しい解決策は、パブリックサフィックスリストを使用してドメインを解析するパッケージを使用することです。TLDExtractをお勧めします。ここにサンプルコードがあります:
$extract = new LayerShifter\TLDExtract\Extract();
$result = $extract->parse('test.en.example.co.uk');
$result->getSubdomain(); // will return (string) 'test.en'
$result->getSubdomains(); // will return (array) ['test', 'en']
$result->getHostname(); // will return (string) 'example'
$result->getSuffix(); // will return (string) 'co.uk'
// For www.abc.en.example.com
$host_Array = explode(".",$_SERVER['HTTP_HOST']); // Get HOST as array www, abc, en, example, com
array_pop($host_Array); array_pop($host_Array); // Remove com and exmaple
array_shift($host_Array); // Remove www (Optional)
echo implode($host_Array, "."); // Combine array abc.en
私は本当にゲームに遅れていることを知っていますが、ここに行きます。
私がしたことは、HTTP_HOSTサーバー変数($_SERVER['HTTP_HOST']
)とドメイン内の文字数(つまり、example.com
11になるため)を取得することでした。
次に、substr
関数を使用してサブドメインを取得しました。やった
$numberOfLettersInSubdomain = strlen($_SERVER['HTTP_HOST'])-12
$subdomain = substr($_SERVER['HTTP_HOST'], $numberOfLettersInSubdomain);
2番目のパラメーターの部分文字列は1で始まるため、11ではなく12で部分文字列を切り捨てます。したがって、test.example.comと入力すると、の値はに$subdomain
なりますtest
。
これは使用するよりも優れてexplode
います。サブドメインにa .
がある場合、これはそれを切り取らないためです。
$host = $_SERVER['HTTP_HOST'];
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
$domain = $matches[0];
$url = explode($domain, $host);
$subdomain = str_replace('.', '', $url[0]);
echo 'subdomain: '.$subdomain.'<br />';
echo 'domain: '.$domain.'<br />';
PHP 5.3以降では、trueパラメータを指定してstrstr()を使用できます
echo strstr($_SERVER["HTTP_HOST"], '.', true); //prints en
www
、文字列の開始がない場合にのみ機能します。ちょっとささいなアプローチ。
www
ある実際にサブドメイン。歴史的な理由により、ドメイン名自体にエイリアスされているのが一般的です。
function get_subdomain($url=""){
if($url==""){
$url = $_SERVER['HTTP_HOST'];
}
$parsedUrl = parse_url($url);
$host = explode('.', $parsedUrl['path']);
$subdomains = array_slice($host, 0, count($host) - 2 );
return implode(".", $subdomains);
}
$host = explode('.', isset($parsedUrl['path']) ? $parsedUrl['path'] : $parsedUrl['host']);
この関数を使用して複数のサブドメインを処理し、複数のTLDもIPとローカルホストを処理します
function analyse_host($_host)
{
$my_host = explode('.', $_host);
$my_result = ['subdomain' => null, 'root' => null, 'tld' => null];
// if host is ip, only set as root
if(filter_var($_host, FILTER_VALIDATE_IP))
{
// something like 127.0.0.5
$my_result['root'] = $_host;
}
elseif(count($my_host) === 1)
{
// something like localhost
$my_result['root'] = $_host;
}
elseif(count($my_host) === 2)
{
// like jibres.com
$my_result['root'] = $my_host[0];
$my_result['tld'] = $my_host[1];
}
elseif(count($my_host) >= 3)
{
// some conditons like
// ermile.ac.ir
// ermile.jibres.com
// ermile.jibres.ac.ir
// a.ermile.jibres.ac.ir
// get last one as tld
$my_result['tld'] = end($my_host);
array_pop($my_host);
// check last one after remove is probably tld or not
$known_tld = ['com', 'org', 'net', 'gov', 'co', 'ac', 'id', 'sch', 'biz'];
$probably_tld = end($my_host);
if(in_array($probably_tld, $known_tld))
{
$my_result['tld'] = $probably_tld. '.'. $my_result['tld'];
array_pop($my_host);
}
$my_result['root'] = end($my_host);
array_pop($my_host);
// all remain is subdomain
if(count($my_host) > 0)
{
$my_result['subdomain'] = implode('.', $my_host);
}
}
return $my_result;
}
現在のURL = sub.example.comと仮定します
$ host = array_reverse(explode( '。'、$ _SERVER ['SERVER_NAME'])); if(count($ host)> = 3){ echo "メインドメインは="。$ host [1]。 "。"。$ host [0]。 "&サブドメインは="。$ host [2]; //メインドメインは= example.comで、サブドメインは= subです } そうしないと { echo "メインドメインは="。$ host [1]。 "。"。$ host [0]。 "&サブドメインが見つかりません"; // "メインドメインは= example.com&サブドメインが見つかりません"; }
最初の期間の前に来るものだけが必要な場合:
list($sub) = explode('.', 'en.example.com', 2);
parse_url()
、ホストの抽出に使用します。