URL의 하위 도메인을 가져오는 PHP 함수
PHP에 서브도메인 이름을 취득하는 기능이 있습니까?
다음 예제에서는 URL의 "en" 부분을 가져옵니다.
en.example.com
다음은 한 줄의 솔루션입니다.
array_shift((explode('.', $_SERVER['HTTP_HOST'])));
또는 예를 들어 다음과 같습니다.
array_shift((explode('.', 'en.example.com')));
EDIT: 이중 괄호를 추가하여 "변수만 참조로 전달해야 합니다"를 수정했습니다.
편집 2: PHP 5.4부터는 다음 작업을 간단하게 수행할 수 있습니다.
explode('.', 'en.example.com')[0];
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
<?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 'sub'
?>
도메인 서픽스의 신뢰할 수 있는 소스는 도메인 레지스트라뿐이기 때문에 도메인 레지스트라 없이는 서브도메인을 찾을 수 없습니다.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);
}
가장 심플하고 빠른 솔루션.
$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_HOST']);
PHP 7.0: 폭발 기능을 사용하여 모든 결과의 목록을 만듭니다.
list($subdomain,$host) = explode('.', $_SERVER["SERVER_NAME"]);
예: sub.domain.com
echo $subdomain;
결과: 서브
echo $host;
결과: 도메인
$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, '.'));
regex, string functions, parse_url() 또는 이들의 조합을 사용하면 실제 솔루션이 아닙니다.도메인에서 제안된 솔루션 중 하나를 테스트하기만 하면 됩니다.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'
제가 찾은 가장 좋고 짧은 해결책은
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
.
이게 도움이 됐으면 좋겠어요.
간단하게
reset(explode(".", $_SERVER['HTTP_HOST']))
이런 거 하고 있어요.
$url = https://en.example.com
$splitedBySlash = explode('/', $url);
$splitedByDot = explode('.', $splitedBySlash[2]);
$subdomain = $splitedByDot[0];
현재 URL = sub.example.com로 가정합니다.
$host = array_sarray(예: array_sarray)., $_SERVER['SERVER_NAME']); if (count scount host)> = 3){echo "Main domain is = " 입니다.$host[1]."."."$host[0]." & 서브도메인은 = " 입니다.$host[2]; // 주 도메인은 = example.com이고 하위 도메인은 = 하위 도메인입니다.} 기타 {echo "Main domain is = " 입니다.$host [ 1 ] " " . $host [ 0 ] " & subdomain을 찾을 수 없습니다.// "주 도메인은 = example.com이고 하위 도메인을 찾을 수 없습니다.";}
가장 일반적인 도메인과 연계하여 필요에 따라 확장 배열을 조정할 수 있는 솔루션입니다.
$SubDomain = explode('.', explode('|ext|', str_replace(array('.com', '.net', '.org'), '|ext|',$_SERVER['HTTP_HOST']))[0]);
// 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
subdomain을 가져오는 함수.했다
$numberOfLettersInSubdomain = strlen($_SERVER['HTTP_HOST'])-12
$subdomain = substr($_SERVER['HTTP_HOST'], $numberOfLettersInSubdomain);
두 번째 파라미터는 서브스트링이 1부터 시작되므로 11이 아닌 12에서 서브스트링을 끊었습니다.이제 test.example.com을 입력했다면$subdomain
되지요test
.
이것은 사용하는 것보다 낫다.explode
왜냐하면 서브도메인에는,.
이렇게 해도 끊기지 않아요.
drupal 7을 사용하는 경우
다음과 같은 이점이 있습니다.
global $base_path;
global $base_root;
$fulldomain = parse_url($base_root);
$splitdomain = explode(".", $fulldomain['host']);
$subdomain = $splitdomain[0];
$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 파라미터와 함께 str()를 사용할 수 있습니다.
echo strstr($_SERVER["HTTP_HOST"], '.', true); //prints en
이거 드셔보세요.
$domain = 'en.example.com';
$tmp = explode('.', $domain);
$subdomain = current($tmp);
echo($subdomain); // echo "en"
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);
}
이것도 쓸 수 있어
echo substr($_SERVER['HTTP_HOST'], 0, strrpos($_SERVER['HTTP_HOST'], '.', -5));
이 함수를 사용하여 여러 서브도메인을 처리하고 여러 tld도 ip 및 localhost를 처리합니다.
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;
}
늦었을지도 모르지만, 그 포스트는 오래되었지만, 내가 도착하자마자, 다른 많은 사람들은 그렇게 한다.
오늘날 휠은 이미 발명되었으며, 활성화되어 있으며 두 가지 메커니즘을 사용할 수 있습니다.하나는 퍼블릭 서픽스목록을 기반으로 하고 다른 하나는 IANA 목록을 기반으로 합니다.
심플하고 효과적이기 때문에 확장자와 그 종류가 매우 변화하기 쉬운 환경에서 데이터가 유지되고 있음을 알 수 있는 간단한 도우미를 만들 수 있습니다.
이 투고에 기재되어 있는 답변의 대부분은 특정 전류 확장자와 여러 레벨의 배리언트를 체크하는 유닛테스트를 통과하지 못하고 확장문자를 가진 도메인의 캐스터리에서도 통과하지 못하고 있습니다.
나한테 도움이 됐던 것처럼 너한테도 도움이 됐겠지
<?php
// Your code here!
function get_domain($host) {
$parts = explode('.',$host);
$extension = $parts[count($parts)-1];
$name = $parts[count($parts)-2];
return $name.'.'.$extension;
}
echo get_domain("https://api.neoistone.com");
?>
첫 번째 기간 전에 오는 것만 원하는 경우:
list($sub) = explode('.', 'en.example.com', 2);
언급URL : https://stackoverflow.com/questions/5292937/php-function-to-get-the-subdomain-of-a-url
'programing' 카테고리의 다른 글
오류: 요청 엔티티가 너무 큽니다. (0) | 2022.09.28 |
---|---|
mysql 명령어가 mysql 대신 mariaDB를 시작합니다. (0) | 2022.09.28 |
mySQL 오류 1040:접속이 너무 많다 (0) | 2022.09.28 |
MySQL 시스템 데이터베이스 테이블을 InnoDB로 변환할 수 있습니까? (0) | 2022.09.28 |
Python의 zip 기능과 동등한 Javascript (0) | 2022.09.28 |