[php] 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.



답변

체크 아웃 parse_url():

$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 


답변

100 % 작동하도록 의도 된 코드는 나를 위해 그것을 잘라 내지 않는 것 같습니다. 나는 예제를 조금 패치했지만 도움이되지 않고 문제가있는 코드를 찾았습니다. 그래서 몇 가지 기능으로 변경했습니다 (모질라에게 항상 목록을 요구하고 캐시 시스템을 제거하기 위해). 이것은 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

나는 이것을 수업으로 바꾸어야했지만 시간이 없었 음을 알고있다.


답변

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


답변

string http://google.com/dhasjkdas/sadsdds/sdda/sdads.html에서 호스트를 추출하려면 parse_url () 사용법이 적합합니다.

그러나 도메인이나 그 부분을 추출하려면 Public Suffix List 를 사용하는 패키지가 필요합니다 . 예, parse_url () 문자열 함수 arround를 사용할 수 있지만 때로는 잘못된 결과가 생성됩니다.

도메인 구문 분석을 위해 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'


답변

@philfreo의 솔루션 (php.net에서 참조)이 훌륭한 결과를 얻는 것이 꽤 좋지만 경우에 따라 PHP의 “알림”및 “엄격한 표준”메시지를 보여줍니다. 이 코드의 고정 버전입니다.

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