programing

URL에서 도메인 구문 분석

copyandpastes 2022. 10. 1. 21:30
반응형

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_urlurl을 제대로 처리하지 못하지만, 일반적으로 괜찮은 url을 기대한다면 괜찮습니다.

$domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));

이렇게 하면google.comhttp://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.htmlparse_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

worldofjrAlix 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

반응형