URL에서 도메인 구문 분석
URL에서 도메인을 구문 분석하는 기능을 구축해야 합니다.
그래서...
http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
또는
http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html
그것은 돌아올 것이다.google.com
와 함께
http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html
그것은 돌아올 것이다.google.co.uk
.
체크 아웃:
$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'google.com'
parse_url
url을 제대로 처리하지 못하지만, 일반적으로 괜찮은 url을 기대한다면 괜찮습니다.
$domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));
이렇게 하면google.com
http://google.com/ 및 http://www.google.com/에 대해...
http://us3.php.net/manual/en/function.parse-url.php#93983 에서
어떤 이상한 이유로 parse_url은 입력 URL에 스킴이 제공되지 않은 경우 경로로 호스트(example.com 등)를 반환합니다.그래서 저는 실제 호스트를 얻기 위한 빠른 함수를 썼습니다.
function getHost($Address) {
$parseUrl = parse_url(trim($Address));
return trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2)));
}
getHost("example.com"); // Gives example.com
getHost("http://example.com"); // Gives example.com
getHost("www.example.com"); // Gives www.example.com
getHost("http://example.com/xyz"); // Gives example.com
function get_domain($url = SITE_URL)
{
preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
return $_domain_tld[0];
}
get_domain('http://www.cdl.gr'); //cdl.gr
get_domain('http://cdl.gr'); //cdl.gr
get_domain('http://www2.cdl.gr'); //cdl.gr
100% 동작하는 코드가 잘리지 않는 것 같았습니다.예시를 조금 패치했지만 도움이 되지 않는 코드가 발견되어 몇 가지 기능으로 변경했습니다(Mozilla에 목록을 저장하고 캐시 시스템을 제거합니다).이것은 1000개의 URL 세트로 테스트되어 동작하고 있는 것 같습니다.
function domain($url)
{
global $subtlds;
$slds = "";
$url = strtolower($url);
$host = parse_url('http://'.$url,PHP_URL_HOST);
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
foreach($subtlds as $sub){
if (preg_match('/\.'.preg_quote($sub).'$/', $host, $xyz)){
preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
}
}
return @$matches[0];
}
function get_tlds() {
$address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
$content = file($address);
foreach ($content as $num => $line) {
$line = trim($line);
if($line == '') continue;
if(@substr($line[0], 0, 2) == '/') continue;
$line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
if($line == '') continue; //$line = '.'.$line;
if(@$line[0] == '.') $line = substr($line, 1);
if(!strstr($line, '.')) continue;
$subtlds[] = $line;
//echo "{$num}: '{$line}'"; echo "<br>";
}
$subtlds = array_merge(array(
'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk',
'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au'
), $subtlds);
$subtlds = array_unique($subtlds);
return $subtlds;
}
그럼 이렇게 쓰세요.
$subtlds = get_tlds();
echo domain('www.example.com') //outputs: example.com
echo domain('www.example.uk.com') //outputs: example.uk.com
echo domain('www.example.fr') //outputs: example.fr
이걸 수업으로 만들어야 한다는 걸 알지만 시간이 없었어요
승인된 솔루션을 다음과 같이 재접속하는 것을 다음에 나타냅니다.
parse_url()은 항상 모든 서브도메인을 포함하므로 이 함수는 도메인 이름을 잘 해석하지 않습니다.다음은 몇 가지 예입니다.
$url = 'http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'www.google.com'
echo parse_url('https://subdomain.example.com/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.com
echo parse_url('https://subdomain.example.co.uk/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.co.uk
대신 이 실용적인 솔루션을 고려해 보십시오.예를 들어, 'sos.state.oh.us'과 같은 하위 수준의 도메인은 다루지 않지만 많은 도메인 이름을 다루지는 않습니다.
function getDomain($url) {
$host = parse_url($url, PHP_URL_HOST);
if(filter_var($host,FILTER_VALIDATE_IP)) {
// IP address returned as domain
return $host; //* or replace with null if you don't want an IP back
}
$domain_array = explode(".", str_replace('www.', '', $host));
$count = count($domain_array);
if( $count>=3 && strlen($domain_array[$count-2])==2 ) {
// SLD (example.co.uk)
return implode('.', array_splice($domain_array, $count-3,3));
} else if( $count>=2 ) {
// TLD (example.com)
return implode('.', array_splice($domain_array, $count-2,2));
}
}
// Your domains
echo getDomain('http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
echo getDomain('http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
echo getDomain('http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html'); // google.co.uk
// TLD
echo getDomain('https://shop.example.com'); // example.com
echo getDomain('https://foo.bar.example.com'); // example.com
echo getDomain('https://www.example.com'); // example.com
echo getDomain('https://example.com'); // example.com
// SLD
echo getDomain('https://more.news.bbc.co.uk'); // bbc.co.uk
echo getDomain('https://www.bbc.co.uk'); // bbc.co.uk
echo getDomain('https://bbc.co.uk'); // bbc.co.uk
// IP
echo getDomain('https://1.2.3.45'); // 1.2.3.45
마지막으로 Jeremy Kendall의 PHP Domain Parser를 사용하면 URL에서 도메인 이름을 구문 분석할 수 있습니다.리그 URI 호스트명 파서도 이 작업을 수행합니다.
문자열에서 호스트를 추출하려면http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
parse_url()의 사용은 허용 가능한 솔루션입니다.
그러나 도메인 또는 해당 부분을 추출하려면 공용 접미사 목록을 사용하는 패키지가 필요합니다.네, parse_url()에 문자열 함수를 사용할 수 있지만 잘못된 결과가 나올 수 있습니다.
도메인 해석에는 TLDExtract를 추천합니다.다음은 diff를 나타내는 샘플코드입니다.
$extract = new LayerShifter\TLDExtract\Extract();
# For 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'
$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
parse_url($url, PHP_URL_HOST); // will return google.com
$result = $extract->parse($url);
$result->getFullHost(); // will return 'google.com'
$result->getRegistrableDomain(); // will return 'google.com'
$result->getSuffix(); // will return 'com'
# For 'http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html'
$url = 'http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
parse_url($url, PHP_URL_HOST); // will return 'search.google.com'
$result = $extract->parse($url);
$result->getFullHost(); // will return 'search.google.com'
$result->getRegistrableDomain(); // will return 'google.com'
이것은 mozilla sub tlds가 고려되기 때문에 100% 도메인 이름만 찾도록 만든 코드입니다.체크해야 할 것은 그 파일의 캐시를 작성하는 방법뿐이므로 매번 Mozilla를 쿼리하지 않습니다.
어떤 이상한 이유로 co.uk과 같은 도메인이 목록에 없기 때문에 해킹을 몇 가지 수행하여 수동으로 추가해야 합니다.가장 깨끗한 해결책은 아니지만 누군가에게 도움이 되길 바랍니다.
//=====================================================
static function domain($url)
{
$slds = "";
$url = strtolower($url);
$address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
if(!$subtlds = @kohana::cache('subtlds', null, 60))
{
$content = file($address);
foreach($content as $num => $line)
{
$line = trim($line);
if($line == '') continue;
if(@substr($line[0], 0, 2) == '/') continue;
$line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
if($line == '') continue; //$line = '.'.$line;
if(@$line[0] == '.') $line = substr($line, 1);
if(!strstr($line, '.')) continue;
$subtlds[] = $line;
//echo "{$num}: '{$line}'"; echo "<br>";
}
$subtlds = array_merge(Array(
'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk',
'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au',
),$subtlds);
$subtlds = array_unique($subtlds);
//echo var_dump($subtlds);
@kohana::cache('subtlds', $subtlds);
}
preg_match('/^(http:[\/]{2,})?([^\/]+)/i', $url, $matches);
//preg_match("/^(http:\/\/|https:\/\/|)[a-zA-Z-]([^\/]+)/i", $url, $matches);
$host = @$matches[2];
//echo var_dump($matches);
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
foreach($subtlds as $sub)
{
if (preg_match("/{$sub}$/", $host, $xyz))
preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
}
return @$matches[0];
}
PHP_URL_HOST를 두 번째 매개 변수로 parse_url 함수에 전달할 수 있습니다.
$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$host = parse_url($url, PHP_URL_HOST);
print $host; // prints 'google.com'
@philfreo의 솔루션(php.net에서 인용)은 좋은 결과를 얻을 수 있지만, 경우에 따라서는 php의 "param"과 "Strict Standards" 메시지가 나타납니다.여기 이 코드의 고정 버전이 있습니다.
function getHost($url) {
$parseUrl = parse_url(trim($url));
if(isset($parseUrl['host']))
{
$host = $parseUrl['host'];
}
else
{
$path = explode('/', $parseUrl['path']);
$host = $path[0];
}
return trim($host);
}
echo getHost("http://example.com/anything.html"); // example.com
echo getHost("http://www.example.net/directory/post.php"); // www.example.net
echo getHost("https://example.co.uk"); // example.co.uk
echo getHost("www.example.net"); // example.net
echo getHost("subdomain.example.net/anything"); // subdomain.example.net
echo getHost("example.net"); // example.net
function getTrimmedUrl($link)
{
$str = str_replace(["www.","https://","http://"],[''],$link);
$link = explode("/",$str);
return strtolower($link[0]);
}
$domain = parse_url($url, PHP_URL_HOST);
echo implode('.', array_slice(explode('.', $domain), -2, 2))
구글에서 가장 많이 뜨는 답변이라 늦게 추가하겠습니다.
PHP를 사용하여 다음을 수행할 수 있습니다.
$url = "www.google.co.uk";
$host = parse_url($url, PHP_URL_HOST);
// $host == "www.google.co.uk"
호스트가 참조하는 개인 도메인이 아닌 호스트를 가져옵니다(예시).www.google.co.uk
입니다만, 「」라고 하는 것은,google.co.uk
★★★★★★★★★★★★★★★★」
개인 도메인을 가져오려면 개인 도메인을 등록할 수 있는 공용 접미사 목록을 알아야 합니다.이 리스트는 Mozilla가 https://publicsuffix.org/에서 큐레이션하고 있습니다.
다음 코드는 퍼블릭서픽스 배열이 이미 작성되어 있는 경우에 기능합니다.전화만 하면 됩니다.
$domain = get_private_domain("www.google.co.uk");
나머지 코드를 사용하여...
// find some way to parse the above list of public suffix
// then add them to a PHP array
$suffix = [... all valid public suffix ...];
function get_public_suffix($host) {
$parts = split("\.", $host);
while (count($parts) > 0) {
if (is_public_suffix(join(".", $parts)))
return join(".", $parts);
array_shift($parts);
}
return false;
}
function is_public_suffix($host) {
global $suffix;
return isset($suffix[$host]);
}
function get_private_domain($host) {
$public = get_public_suffix($host);
$public_parts = split("\.", $public);
$all_parts = split("\.", $host);
$private = [];
for ($x = 0; $x < count($public_parts); ++$x)
$private[] = array_pop($all_parts);
if (count($all_parts) > 0)
$private[] = array_pop($all_parts);
return join(".", array_reverse($private));
}
parse_url은 나에게 효과가 없었다.경로만 반환되었습니다.php5를 사용하여 기본 설정으로 전환합니다.3+:
$url = str_replace('http://', '', strtolower( $s->website));
if (strpos($url, '/')) $url = strstr($url, '/', true);
편집했습니다.
function getHost($Address) {
$parseUrl = parse_url(trim($Address));
$host = trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2)));
$parts = explode( '.', $host );
$num_parts = count($parts);
if ($parts[0] == "www") {
for ($i=1; $i < $num_parts; $i++) {
$h .= $parts[$i] . '.';
}
}else {
for ($i=0; $i < $num_parts; $i++) {
$h .= $parts[$i] . '.';
}
}
return substr($h,0,-1);
}
모든 유형의 URL(www.domain.ltd, sub1.subn.domain.ltd)은 : domain.ltd가 됩니다.
일반적으로 입력 URL이 완전 정크 상태가 아닌 경우 매우 잘 작동합니다.서브도메인이 삭제됩니다.
$host = parse_url( $Row->url, PHP_URL_HOST );
$parts = explode( '.', $host );
$parts = array_reverse( $parts );
$domain = $parts[1].'.'.$parts[0];
예
력::http://www2.website.com:8080/some/file/structure?some=parameters
★★★★★website.com
worldofjr와 Alix Axel의 답변을 하나의 작은 기능으로 결합하여 대부분의 사용 사례를 처리합니다.
function get_url_hostname($url) {
$parse = parse_url($url);
return str_ireplace('www.', '', $parse['host']);
}
get_url_hostname('http://www.google.com/example/path/file.html'); // google.com
이 테스트 케이스를 사용했을 때는, 이 솔루션 중 어느 것도 효과가 없었습니다.
public function getTestCases(): array
{
return [
//input expected
['http://google.com/dhasjkdas', 'google.com'],
['https://google.com/dhasjkdas', 'google.com'],
['https://www.google.com/dhasjkdas', 'google.com'],
['http://www.google.com/dhasjkdas', 'google.com'],
['www.google.com/dhasjkdas', 'google.com'],
['google.com/dhasjkdas', 'google.com'],
];
}
그러나 이 답변은 모든 경우에 적용되었습니다.https://stackoverflow.com/a/65659814/5884988
다음과 같이 사용합니다.
<?php
echo $_SERVER['SERVER_NAME'];
?>
언급URL : https://stackoverflow.com/questions/276516/parsing-domain-from-a-url
'programing' 카테고리의 다른 글
Larabel - 임시 삭제 - 투고를 다른 테이블로 이동 (0) | 2022.10.01 |
---|---|
Linux에서 Mariadb 10과 호환되는 ODBC 드라이버가 있습니까? (0) | 2022.10.01 |
2분마다 저장된 상태 로그에서 이벤트의 시작/종료 시간을 결정하는 방법 (0) | 2022.09.25 |
새 창이 아닌 새 탭에서 URL 열기 (0) | 2022.09.25 |
array_filter() 뒤에 키를 리셋하여 0부터 순서대로 이동하려면 어떻게 해야 합니까? (0) | 2022.09.25 |