質問

ドメイン名を含む変数を解析する関数を作成する必要があります。例でこれを説明するのが最善です。変数には次のいずれかを含めることができます。

here.example.com
example.com
example.org
here.example.org

しかし、私の関数を介して渡された場合、これらはすべて、基本的にルートドメイン名であるexample.comまたはexample.co.ukを返す必要があります。私はこれをやったことがあると確信していますが、約20分間Googleを検索しており、何も見つかりません。助けていただければ幸いです。

編集:.co.ukを無視し、この関数を通過するすべてのドメインが3文字のTLDを持っていると仮定します。

役に立ちましたか?

解決

Stackoverflow質問アーカイブ:


print get_domain("http://somedomain.co.uk"); // outputs 'somedomain.co.uk'

function get_domain($url)
{
  $pieces = parse_url($url);
  $domain = isset($pieces['host']) ? $pieces['host'] : '';
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
    return $regs['domain'];
  }
  return false;
}

他のヒント

次のようなことをします:

// hierarchical array of top level domains
$tlds = array(
    'com' => true,
    'uk' => array(
        'co' => true,
        // …
    ),
    // …
);
$domain = 'here.example.co.uk';
// split domain
$parts = explode('.', $domain);
$tmp = $tlds;
// travers the tree in reverse order, from right to left
foreach (array_reverse($parts) as $key => $part) {
    if (isset($tmp[$part])) {
        $tmp = $tmp[$part];
    } else {
        break;
    }
}
// build the result
var_dump(implode('.', array_slice($parts, - $key - 1)));

Mozillaが持っているデータベースを使用することになりました。

ここに私のコードがあります:

fetch_mozilla_tlds.phpには、キャッシュアルゴリズムが含まれています。この行は重要です:

$mozillaTlds = file('http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1');

アプリケーション内で使用されるメインファイルは次のとおりです。     

function isTopLevelDomain($domain)
{
    $domainParts = explode('.', $domain);
    if (count($domainParts) == 1) {
        return false;
    }

    $previousDomainParts = $domainParts;
    array_shift($previousDomainParts);

    $tld = implode('.', $previousDomainParts);

    return isDomainExtension($tld);
}

function isDomainExtension($domain)
{
    $tlds = getTLDs();

    /**
     * direct hit
     */
    if (in_array($domain, $tlds)) {
        return true;
    }

    if (in_array('!'. $domain, $tlds)) {
        return false;
    }

    $domainParts = explode('.', $domain);

    if (count($domainParts) == 1) {
        return false;
    }

    $previousDomainParts = $domainParts;

    array_shift($previousDomainParts);
    array_unshift($previousDomainParts, '*');

    $wildcardDomain = implode('.', $previousDomainParts);

    return in_array($wildcardDomain, $tlds);
}

function getTLDs()
{
    static $mozillaTlds = array();

    if (empty($mozillaTlds)) {
        require 'fetch_mozilla_tlds.php';
        /* @var $mozillaTlds array */
    }

    return $mozillaTlds;
}

更新:
データベースは進化し、独自のWebサイトで入手できるようになりました- http://publicsuffix.org/

外部呼び出しや事前定義された配列のチェックなしで、高速でシンプルなソリューションが必要な場合。 &quot; www.domain.gallery&quot;のような新しいドメインで機能します。また、最も一般的な回答とは異なります。

function get_domain($host){
  $myhost = strtolower(trim($host));
  $count = substr_count($myhost, '.');
  if($count === 2){
    if(strlen(explode('.', $myhost)[1]) > 3) $myhost = explode('.', $myhost, 2)[1];
  } else if($count > 2){
    $myhost = get_domain(explode('.', $myhost, 2)[1]);
  }
  return $myhost;
}
  • domain.com-&gt; domain.com
  • sub.domain.com-&gt; domain.com
  • www.domain.com-&gt; domain.com
  • www.sub.domain.com-&gt; domain.com
  • domain.co.uk-&gt; domain.co.uk
  • sub.domain.co.uk-&gt; domain.co.uk
  • www.domain.co.uk-&gt; domain.co.uk
  • www.sub.domain.co.uk-&gt; domain.co.uk
  • domain.photography-&gt; domain.photography
  • www.domain.photography-&gt; domain.photography
  • www.sub.domain.photography-&gt; domain.photography

ほぼ確実に、あなたが探しているのはこれです:

https://github.com/Synchro/regdom-php

これは、publicsuffix.org / list /で収集されたさまざまなTLDの完全なリスト(ほぼ実用的)を利用するPHPライブラリであり、それを簡潔で小さな関数にまとめています。

ライブラリが含まれると、次のように簡単になります:

$ registeredDomain = getRegisteredDomain($ domain);

    $full_domain = <*>SERVER['SERVER_NAME'];
$just_domain = preg_replace("/^(.*\.)?([^.]*\..*)$/", "$2", <*>SERVER['HTTP_HOST']);

このスクリプトは、ETLDファイルから単一の関数get_domainを含むPerlファイルを生成します。 .photobucket.comにimg1、img2、img3などのホスト名があるとします。これらのget_domainのそれぞれに対して、$ hostはphotobucket.comを返します。これは地球上で最速の関数ではないことに注意してください。そのため、これを使用するメインログパーサーでは、ホストからドメインへのマッピングのハッシュを保持し、まだハッシュにないホストに対してのみ実行します。

#!/bin/bash

cat << 'EOT' > suffixes.pl
#!/bin/perl

sub get_domain {
  

このスクリプトは、ETLDファイルから単一の関数get_domainを含むPerlファイルを生成します。 .photobucket.comにimg1、img2、img3などのホスト名があるとします。これらのget_domainのそれぞれに対して、$ hostはphotobucket.comを返します。これは地球上で最速の関数ではないことに注意してください。そのため、これを使用するメインログパーサーでは、ホストからドメインへのマッピングのハッシュを保持し、まだハッシュにないホストに対してのみ実行します。

<*> = shift; EOT wget -O - http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 \ | iconv -c -f UTF-8 -t ASCII//TRANSLIT \ | egrep -v '/|^ \ | sed -e 's/^\!//' -e "s/\"/'/g" \ | awk '{ print length(<*>),<*> | "sort -rn"}' | cut -d" " -f2- \ | while read SUFF; do STAR=`echo $SUFF | cut -b1` if [ "$STAR" = '*' ]; then SUFF=`echo $SUFF | cut -b3-` echo " return \"\$1\.\$2\.$SUFF\" if /([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-]+)\.$SUFF\$/;" else echo " return \"\$1\.$SUFF\" if /([a-zA-Z0-9\-]+)\.$SUFF\$/;" fi done >> suffixes.pl cat << 'EOT' >> suffixes.pl } 1; EOT

これは、それを達成するための短い方法です:

$host = 

これは、それを達成するための短い方法です:

<*>SERVER['HTTP_HOST']; preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches); echo "domain name is: {$matches[0]}\n";

これは絶対確実ではなく、ドメインが不明瞭にならないことがわかっている場合にのみ実際に使用する必要がありますが、他のほとんどのオプションよりも読みやすいです:

$justDomain = 

これは絶対確実ではなく、ドメインが不明瞭にならないことがわかっている場合にのみ実際に使用する必要がありますが、他のほとんどのオプションよりも読みやすいです:

<*>SERVER['SERVER_NAME']; switch(substr_count($justDomain, '.')) { case 1: // 2 parts. Must not be a subdomain. Do nothing. break; case 2: // 3 parts. Either a subdomain or a 2-part suffix // If the 2nd part is over 3 chars's, assume it to be the main domain part which means we have a subdomain. // This isn't foolproof, but should be ok for most domains. // Something like domainname.parliament.nz would cause problems, though. As would www.abc.com $parts = explode('.', $justDomain); if(strlen($parts[1]) > 3) { unset($parts[0]); $justDomain = implode('.', $parts); } break; default: // 4+ parts. Must be a subdomain. $parts = explode('.', $justDomain, 2); $justDomain = $parts[1]; break; } // $justDomain should now exclude any subdomain part.

Regexが役に立つかもしれません。次のようなものを試してください:

([^。] +(。com | .co.uk))$

あなたの問題は、関数に何をさせたいかを明確に定義していないことだと思います。あなたの例から、名前の最後の2つ、または最後の3つのコンポーネントを盲目的に返すことは絶対に望んでいませんが、すべきでないことを知るだけでは十分ではありません。

あなたが本当に欲しいものに対する私の推測です: co.uk。のような特定の第2レベルのドメイン名があり、それは単一のTLD(トップレベルドメイン)この機能の目的のため。その場合、このようなすべてのケースを列挙し、 com。 net。<などのすべての通常のトップレベルドメインとともに、ダミー値を持つ連想配列にキーとして配置することをお勧めします。 / code>、 info。など。次に、新しいドメイン名を取得するたびに、最後の2つのコンポーネントを抽出し、結果の文字列がキーとして配列内にあるかどうかを確認します。そうでない場合は、最後のコンポーネントのみを抽出し、それが配列内にあることを確認してください。 (それでもそうでない場合、それは有効なドメイン名ではありません)いずれにせよ、配列内で見つけたキーは何でも、ドメイン名の末尾からさらに1つのコンポーネントを取り除いて、ベースドメインを取得します。

おそらく、最後の2つのコンポーネントを単一の「有効なTLD」として扱う必要があるかどうかを判断するために、連想配列を使用するのではなく、関数を記述することで少し簡単にすることができます。この関数は、おそらく最後から2番目のコンポーネントを調べ、3文字より短い場合、TLDの一部として処理することを決定します。

それをうまく行うには、第2レベルドメインとトップレベルドメインのリストが必要で、適切な正規表現リストを作成します。第2レベルドメインの適切なリストは、 https://wiki.mozilla.org/TLD_List で入手できます。前述のCentralNic .uk.comの変種とは別のテストケースはThe Vaticanです。彼らのWebサイトは技術的には http:// va :それは一致するのが難しいものです!

ジョナサンの答えに基づいて:

function main_domain($domain) {
  if (preg_match('/([a-z0-9][a-z0-9\-]{1,63})\.([a-z]{3}|[a-z]{2}\.[a-z]{2})$/i', $domain, $regs)) {
    return $regs;
  }

  return false;
}

彼の表現は少し良いかもしれませんが、このインターフェースはあなたが説明しているものに似ているようです。

ああ-3文字のトップレベルドメインのみを処理する場合-このコードは機能します:

<?php 
// let's test the code works: these should all return
// example.com , example.net or example.org
$domains=Array('here.example.com',
            'example.com',
            'example.org',
        'here.example.org',
        'example.com/ignorethis',
        'example.net/',
        'http://here.example.org/longtest?string=here');
foreach ($domains as $domain) {
 testdomain($domain);
}

function testdomain($url) {
 if (preg_match('/^((.+)\.)?([A-Za-z][0-9A-Za-z\-]{1,63})\.([A-Za-z]{3})(\/.*)?$/',$url,$matches)) {
    print 'Domain is: '.$matches[3].'.'.$matches[4].'<br>'."\n";
 } else {
    print 'Domain not found in '.$url.'<br>'."\n";
 }
}
?>

$ matches [1] / $ matches [2]には任意のサブドメインおよび/またはプロトコルが含まれ、$ matches [3]にはドメイン名が含まれ、$ matches [4]最上位ドメインおよび$ matches [5]にはその他のURLパス情報。

最も一般的なトップレベルドメインに一致させるには、次のように変更してみてください:

if (preg_match('/^((.+)\.)?([A-Za-z][0-9A-Za-z\-]{1,63})\.([A-Za-z]{2,6})(\/.*)?$/',$url,$matches)) {

またはすべてに対処するには:

if (preg_match('/^((.+)\.)?([A-Za-z][0-9A-Za-z\-]{1,63})\.(co\.uk|me\.uk|org\.uk|com|org|net|int|eu)(\/.*)?$/',$url,$matches)) {

etcなど

http://www.cafewebmaster.com/に基づくfind-top-level-domain-international-urls-php

function find_tld($url){

$purl  = parse_url($url);
$host  = strtolower($purl['host']);

$valid_tlds = ".ab.ca .bc.ca .mb.ca .nb.ca .nf.ca .nl.ca .ns.ca .nt.ca .nu.ca .on.ca .pe.ca .qc.ca .sk.ca .yk.ca .com.cd .net.cd .org.cd .com.ch .net.ch .org.ch .gov.ch .co.ck .ac.cn .com.cn .edu.cn .gov.cn .net.cn .org.cn .ah.cn .bj.cn .cq.cn .fj.cn .gd.cn .gs.cn .gz.cn .gx.cn .ha.cn .hb.cn .he.cn .hi.cn .hl.cn .hn.cn .jl.cn .js.cn .jx.cn .ln.cn .nm.cn .nx.cn .qh.cn .sc.cn .sd.cn .sh.cn .sn.cn .sx.cn .tj.cn .xj.cn .xz.cn .yn.cn .zj.cn .com.co .edu.co .org.co .gov.co .mil.co .net.co .nom.co .com.cu .edu.cu .org.cu .net.cu .gov.cu .inf.cu .gov.cx .edu.do .gov.do .gob.do .com.do .org.do .sld.do .web.do .net.do .mil.do .art.do .com.dz .org.dz .net.dz .gov.dz .edu.dz .asso.dz .pol.dz .art.dz .com.ec .info.ec .net.ec .fin.ec .med.ec .pro.ec .org.ec .edu.ec .gov.ec .mil.ec .com.ee .org.ee .fie.ee .pri.ee .eun.eg .edu.eg .sci.eg .gov.eg .com.eg .org.eg .net.eg .mil.eg .com.es .nom.es .org.es .gob.es .edu.es .com.et .gov.et .org.et .edu.et .net.et .biz.et .name.et .info.et .co.fk .org.fk .gov.fk .ac.fk .nom.fk .net.fk .tm.fr .asso.fr .nom.fr .prd.fr .presse.fr .com.fr .gouv.fr .com.ge .edu.ge .gov.ge .org.ge .mil.ge .net.ge .pvt.ge .co.gg .net.gg .org.gg .com.gi .ltd.gi .gov.gi .mod.gi .edu.gi .org.gi .com.gn .ac.gn .gov.gn .org.gn .net.gn .com.gr .edu.gr .net.gr .org.gr .gov.gr .com.hk .edu.hk .gov.hk .idv.hk .net.hk .org.hk .com.hn .edu.hn .org.hn .net.hn .mil.hn .gob.hn .iz.hr .from.hr .name.hr .com.hr .com.ht .net.ht .firm.ht .shop.ht .info.ht .pro.ht .adult.ht .org.ht .art.ht .pol.ht .rel.ht .asso.ht .perso.ht .coop.ht .med.ht .edu.ht .gouv.ht .gov.ie .co.in .firm.in .net.in .org.in .gen.in .ind.in .nic.in .ac.in .edu.in .res.in .gov.in .mil.in .ac.ir .co.ir .gov.ir .net.ir .org.ir .sch.ir .gov.it .co.je .net.je .org.je .edu.jm .gov.jm .com.jm .net.jm .com.jo .org.jo .net.jo .edu.jo .gov.jo .mil.jo .co.kr .or.kr .com.kw .edu.kw .gov.kw .net.kw .org.kw .mil.kw .edu.ky .gov.ky .com.ky .org.ky .net.ky .org.kz .edu.kz .net.kz .gov.kz .mil.kz .com.kz .com.li .net.li .org.li .gov.li .gov.lk .sch.lk .net.lk .int.lk .com.lk .org.lk .edu.lk .ngo.lk .soc.lk .web.lk .ltd.lk .assn.lk .grp.lk .hotel.lk .com.lr .edu.lr .gov.lr .org.lr .net.lr .org.ls .co.ls .gov.lt .mil.lt .gov.lu .mil.lu .org.lu .net.lu .com.lv .edu.lv .gov.lv .org.lv .mil.lv .id.lv .net.lv .asn.lv .conf.lv .com.ly .net.ly .gov.ly .plc.ly .edu.ly .sch.ly .med.ly .org.ly .id.ly .co.ma .net.ma .gov.ma .org.ma .tm.mc .asso.mc .org.mg .nom.mg .gov.mg .prd.mg .tm.mg .com.mg .edu.mg .mil.mg .com.mk .org.mk .com.mo .net.mo .org.mo .edu.mo .gov.mo .org.mt .com.mt .gov.mt .edu.mt .net.mt .com.mu .co.mu .aero.mv .biz.mv .com.mv .coop.mv .edu.mv .gov.mv .info.mv .int.mv .mil.mv .museum.mv .name.mv .net.mv .org.mv .pro.mv .com.mx .net.mx .org.mx .edu.mx .gob.mx .com.my .net.my .org.my .gov.my .edu.my .mil.my .name.my .edu.ng .com.ng .gov.ng .org.ng .net.ng .gob.ni .com.ni .edu.ni .org.ni .nom.ni .net.ni .gov.nr .edu.nr .biz.nr .info.nr .com.nr .net.nr .ac.nz .co.nz .cri.nz .gen.nz .geek.nz .govt.nz .iwi.nz .maori.nz .mil.nz .net.nz .org.nz .school.nz .com.pf .org.pf .edu.pf .com.pg .net.pg .com.ph .gov.ph .com.pk .net.pk .edu.pk .org.pk .fam.pk .biz.pk .web.pk .gov.pk .gob.pk .gok.pk .gon.pk .gop.pk .gos.pk .com.pl .biz.pl .net.pl .art.pl .edu.pl .org.pl .ngo.pl .gov.pl .info.pl .mil.pl .waw.pl .warszawa.pl .wroc.pl .wroclaw.pl .krakow.pl .poznan.pl .lodz.pl .gda.pl .gdansk.pl .slupsk.pl .szczecin.pl .lublin.pl .bialystok.pl .olsztyn.pl .torun.pl .biz.pr .com.pr .edu.pr .gov.pr .info.pr .isla.pr .name.pr .net.pr .org.pr .pro.pr .edu.ps .gov.ps .sec.ps .plo.ps .com.ps .org.ps .net.ps .com.pt .edu.pt .gov.pt .int.pt .net.pt .nome.pt .org.pt .publ.pt .net.py .org.py .gov.py .edu.py .com.py .com.ru .net.ru .org.ru .pp.ru .msk.ru .int.ru .ac.ru .gov.rw .net.rw .edu.rw .ac.rw .com.rw .co.rw .int.rw .mil.rw .gouv.rw .com.sa .edu.sa .sch.sa .med.sa .gov.sa .net.sa .org.sa .pub.sa .com.sb .gov.sb .net.sb .edu.sb .com.sc .gov.sc .net.sc .org.sc .edu.sc .com.sd .net.sd .org.sd .edu.sd .med.sd .tv.sd .gov.sd .info.sd .org.se .pp.se .tm.se .parti.se .press.se .ab.se .c.se .d.se .e.se .f.se .g.se .h.se .i.se .k.se .m.se .n.se .o.se .s.se .t.se .u.se .w.se .x.se .y.se .z.se .ac.se .bd.se .com.sg .net.sg .org.sg .gov.sg .edu.sg .per.sg .idn.sg .edu.sv .com.sv .gob.sv .org.sv .red.sv .gov.sy .com.sy .net.sy .ac.th .co.th .in.th .go.th .mi.th .or.th .net.th .ac.tj .biz.tj .com.tj .co.tj .edu.tj .int.tj .name.tj .net.tj .org.tj .web.tj .gov.tj .go.tj .mil.tj .com.tn .intl.tn .gov.tn .org.tn .ind.tn .nat.tn .tourism.tn .info.tn .ens.tn .fin.tn .net.tn .gov.to .gov.tp .com.tr .info.tr .biz.tr .net.tr .org.tr .web.tr .gen.tr .av.tr .dr.tr .bbs.tr .name.tr .tel.tr .gov.tr .bel.tr .pol.tr .mil.tr .k12.tr .edu.tr .co.tt .com.tt .org.tt .net.tt .biz.tt .info.tt .pro.tt .name.tt .edu.tt .gov.tt .gov.tv .edu.tw .gov.tw .mil.tw .com.tw .net.tw .org.tw .idv.tw .game.tw .ebiz.tw .club.tw .co.tz .ac.tz .go.tz .or.tz .ne.tz .com.ua .gov.ua .net.ua .edu.ua .org.ua .cherkassy.ua .ck.ua .chernigov.ua .cn.ua .chernovtsy.ua .cv.ua .crimea.ua .dnepropetrovsk.ua .dp.ua .donetsk.ua .dn.ua .if.ua .kharkov.ua .kh.ua .kherson.ua .ks.ua .khmelnitskiy.ua .km.ua .kiev.ua .kv.ua .kirovograd.ua .kr.ua .lugansk.ua .lg.ua .lutsk.ua .lviv.ua .nikolaev.ua .mk.ua .odessa.ua .od.ua .poltava.ua .pl.ua .rovno.ua .rv.ua .sebastopol.ua .sumy.ua .ternopil.ua .te.ua .uzhgorod.ua .vinnica.ua .vn.ua .zaporizhzhe.ua .zp.ua .zhitomir.ua .zt.ua .co.ug .ac.ug .sc.ug .go.ug .ne.ug .or.ug .ac.uk .co.uk .gov.uk .ltd.uk .me.uk .mil.uk .mod.uk .net.uk .nic.uk .nhs.uk .org.uk .plc.uk .police.uk .bl.uk .icnet.uk .jet.uk .nel.uk .nls.uk .parliament.uk .sch.uk .ak.us .al.us .ar.us .az.us .ca.us .co.us .ct.us .dc.us .de.us .dni.us .fed.us .fl.us .ga.us .hi.us .ia.us .id.us .il.us .in.us .isa.us .kids.us .ks.us .ky.us .la.us .ma.us .md.us .me.us .mi.us .mn.us .mo.us .ms.us .mt.us .nc.us .nd.us .ne.us .nh.us .nj.us .nm.us .nsn.us .nv.us .ny.us .oh.us .ok.us .or.us .pa.us .ri.us .sc.us .sd.us .tn.us .tx.us .ut.us .vt.us .va.us .wa.us .wi.us .wv.us .wy.us .edu.uy .gub.uy .org.uy .com.uy .net.uy .mil.uy .com.ve .net.ve .org.ve .info.ve .co.ve .web.ve .com.vi .org.vi .edu.vi .gov.vi .com.vn .net.vn .org.vn .edu.vn .gov.vn .int.vn .ac.vn .biz.vn .info.vn .name.vn .pro.vn .health.vn .com.ye .net.ye .ac.yu .co.yu .org.yu .edu.yu .ac.za .city.za .co.za .edu.za .gov.za .law.za .mil.za .nom.za .org.za .school.za .alt.za .net.za .ngo.za .tm.za .web.za .co.zm .org.zm .gov.zm .sch.zm .ac.zm .co.zw .org.zw .gov.zw .ac.zw .com.ac .edu.ac .gov.ac .net.ac .mil.ac .org.ac .nom.ad .net.ae .co.ae .gov.ae .ac.ae .sch.ae .org.ae .mil.ae .pro.ae .name.ae .com.ag .org.ag .net.ag .co.ag .nom.ag .off.ai .com.ai .net.ai .org.ai .gov.al .edu.al .org.al .com.al .net.al .com.am .net.am .org.am .com.ar .net.ar .org.ar .e164.arpa .ip6.arpa .uri.arpa .urn.arpa .gv.at .ac.at .co.at .or.at .com.au .net.au .asn.au .org.au .id.au .csiro.au .gov.au .edu.au .com.aw .com.az .net.az .org.az .com.bb .edu.bb .gov.bb .net.bb .org.bb .com.bd .edu.bd .net.bd .gov.bd .org.bd .mil.be .ac.be .gov.bf .com.bm .edu.bm .org.bm .gov.bm .net.bm .com.bn .edu.bn .org.bn .net.bn .com.bo .org.bo .net.bo .gov.bo .gob.bo .edu.bo .tv.bo .mil.bo .int.bo .agr.br .am.br .art.br .edu.br .com.br .coop.br .esp.br .far.br .fm.br .g12.br .gov.br .imb.br .ind.br .inf.br .mil.br .net.br .org.br .psi.br .rec.br .srv.br .tmp.br .tur.br .tv.br .etc.br .adm.br .adv.br .arq.br .ato.br .bio.br .bmd.br .cim.br .cng.br .cnt.br .ecn.br .eng.br .eti.br .fnd.br .fot.br .fst.br .ggf.br .jor.br .lel.br .mat.br .med.br .mus.br .not.br .ntr.br .odo.br .ppg.br .pro.br .psc.br .qsl.br .slg.br .trd.br .vet.br .zlg.br .dpn.br .nom.br .com.bs .net.bs .org.bs .com.bt .edu.bt .gov.bt .net.bt .org.bt .co.bw .org.bw .gov.by .mil.by .ac.cr .co.cr .ed.cr .fi.cr .go.cr .or.cr .sa.cr .com.cy .biz.cy .info.cy .ltd.cy .pro.cy .net.cy .org.cy .name.cy .tm.cy .ac.cy .ekloges.cy .press.cy .parliament.cy .com.dm .net.dm .org.dm .edu.dm .gov.dm .biz.fj .com.fj .info.fj .name.fj .net.fj .org.fj .pro.fj .ac.fj .gov.fj .mil.fj .school.fj .com.gh .edu.gh .gov.gh .org.gh .mil.gh .co.hu .info.hu .org.hu .priv.hu .sport.hu .tm.hu .2000.hu .agrar.hu .bolt.hu .casino.hu .city.hu .erotica.hu .erotika.hu .film.hu .forum.hu .games.hu .hotel.hu .ingatlan.hu .jogasz.hu .konyvelo.hu .lakas.hu .media.hu .news.hu .reklam.hu .sex.hu .shop.hu .suli.hu .szex.hu .tozsde.hu .utazas.hu .video.hu .ac.id .co.id .or.id .go.id .ac.il .co.il .org.il .net.il .k12.il .gov.il .muni.il .idf.il .co.im .net.im .gov.im .org.im .nic.im .ac.im .org.jm .ac.jp .ad.jp .co.jp .ed.jp .go.jp .gr.jp .lg.jp .ne.jp .or.jp .hokkaido.jp .aomori.jp .iwate.jp .miyagi.jp .akita.jp .yamagata.jp .fukushima.jp .ibaraki.jp .tochigi.jp .gunma.jp .saitama.jp .chiba.jp .tokyo.jp .kanagawa.jp .niigata.jp .toyama.jp .ishikawa.jp .fukui.jp .yamanashi.jp .nagano.jp .gifu.jp .shizuoka.jp .aichi.jp .mie.jp .shiga.jp .kyoto.jp .osaka.jp .hyogo.jp .nara.jp .wakayama.jp .tottori.jp .shimane.jp .okayama.jp .hiroshima.jp .yamaguchi.jp .tokushima.jp .kagawa.jp .ehime.jp .kochi.jp .fukuoka.jp .saga.jp .nagasaki.jp .kumamoto.jp .oita.jp .miyazaki.jp .kagoshima.jp .okinawa.jp .sapporo.jp .sendai.jp .yokohama.jp .kawasaki.jp .nagoya.jp .kobe.jp .kitakyushu.jp .per.kh .com.kh .edu.kh .gov.kh .mil.kh .net.kh .org.kh .net.lb .org.lb .gov.lb .edu.lb .com.lb .com.lc .org.lc .edu.lc .gov.lc .army.mil .navy.mil .weather.mobi .music.mobi .ac.mw .co.mw .com.mw .coop.mw .edu.mw .gov.mw .int.mw .museum.mw .net.mw .org.mw .mil.no .stat.no .kommune.no .herad.no .priv.no .vgs.no .fhs.no .museum.no .fylkesbibl.no .folkebibl.no .idrett.no .com.np .org.np .edu.np .net.np .gov.np .mil.np .org.nr .com.om .co.om .edu.om .ac.com .sch.om .gov.om .net.om .org.om .mil.om .museum.om .biz.om .pro.om .med.om .com.pa .ac.pa .sld.pa .gob.pa .edu.pa .org.pa .net.pa .abo.pa .ing.pa .med.pa .nom.pa .com.pe .org.pe .net.pe .edu.pe .mil.pe .gob.pe .nom.pe .law.pro .med.pro .cpa.pro .vatican.va .ac .ad .ae .aero .af .ag .ai .al .am .an .ao .aq .ar .arpa .as .at .au .aw .az .ba .bb .bd .be .bf .bg .bh .bi .biz .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cat .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .com .coop .cr .cu .cv .cx .cy .cz .de .dj .dk .dm .do .dz .ec .edu .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gov .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .info .int .io .iq .ir .is .it .je .jm .jo .jobs .jp .ke .kg .kh .ki .km .kn .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .mg .mh .mil .mk .ml .mm .mn .mo .mobi .mp .mq .mr .ms .mt .mu .museum .mv .mw .na .name .nc .ne .net .nf .ng .ni .nl .no .np .nr .nu .nz .om .org .pa .pe .pf .pg .ph .pk .pl .pm .pn .post .pr .pro .ps .pt .pw .py .qa .re .ro .ru .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .travel .tt .tv .tw .tz .ua .ug .uk .um .us .uy .uz .va .vc .ve .vg .vi .vn .vuwf .ye .yt .yu .za .zm .zw .ca .cd .ch .cn .cu .cx .dm .dz .ec .ee .es .fr .ge .gg .gi .gr .hk .hn .hr .ht .hu .ie .in .ir .it .je .jo .jp .kr .ky .li .lk .lt .lu .lv .ly .ma .mc .mg .mk .mo .mt .mu .nl .no .nr .nr .pf .ph .pk .pl .pr .ps .pt .ro .ru .rw .sc .sd .se .sg .tj .to .to .tt .tv .tw .tw .tw .tw .ua .ug .us .vi .vn";



    $tld_regex = '#(.*?)([^.]+)('.str_replace(array('.',' '),array('\\.','|'),$valid_tlds).')$#';

    //remove the extension
    preg_match($tld_regex,$host,$matches);

    if(!empty($matches) && sizeof($matches) > 2){
        $extension = array_pop($matches);
        $tld = array_pop($matches);
        return $tld.$extension;

    }else{ //change to "false" if you prefer
        return $host;
    }



}

ジョナサンサンプソンのバリアントとして

function get_domain($url)   {   
    if ( !preg_match("/^http/", $url) )
        $url = 'http://' . $url;
    if ( $url[strlen($url)-1] != '/' )
        $url .= '/';
    $pieces = parse_url($url);
    $domain = isset($pieces['host']) ? $pieces['host'] : ''; 
    if ( preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs) ) { 
        $res = preg_replace('/^www\./', '', $regs['domain'] );
        return $res;
    }   
    return false;
}

私が使用しているものは次のとおりです。 tldの配列を必要とせずに素晴らしい動作をします

$split = array_reverse(explode(".", 

私が使用しているものは次のとおりです。 tldの配列を必要とせずに素晴らしい動作をします

<*>SERVER['HTTP_HOST'])); $domain = $split[1].".".$split[0]; if(function_exists('gethostbyname')) { if(gethostbyname($domain) !=

私が使用しているものは次のとおりです。 tldの配列を必要とせずに素晴らしい動作をします

<*>SERVER['SERVER_ADDR'] && isset($split[2])) { $domain = $split[2].".".$split[1].".".$split[0]; } }

TLDリストを使用せずに比較することはできません。 http://www.db.de/ または http://bbc.co.uk/

しかし、それでも SLDののためにすべてのケースで成功するわけではありません http://big.uk.com/ または http://www.uk.com/

完全なリストが必要な場合は、パブリックサフィックスリストを使用できます。

http://mxr.mozilla。 org / mozilla-central / source / netwerk / dns / effective_tld_names.dat?raw = 1

私の機能を自由に使用してください。正規表現を使用せず、高速です:

http://www.programmierer-forum.de/domainnamen- ermitteln-t244185.htm#3471878

URLからTLDを削除する方法は次のとおりです。自分のサイトで動作するコードを作成しました。
http://internet-portal.me/ -これは私のサイトで使用されている実用的なソリューションです。

$ hostは、解析する必要があるURLです。このコードはシンプルなソリューションであり、信頼性があります
私が見た他のすべてと比較して、それは私が試したどんなURLでも動作します!!!
ご覧のページを解析するこのコードをご覧ください!
http://internet-portal.me/domain/?dns=https://stackoverflow.com/questions/1201194/php-getting-domain-name-from-subdomain/6320437#6320437

=============================================== ==================================

$host = filter_var(

URLからTLDを削除する方法は次のとおりです。自分のサイトで動作するコードを作成しました。
http://internet-portal.me/ -これは私のサイトで使用されている実用的なソリューションです。

$ hostは、解析する必要があるURLです。このコードはシンプルなソリューションであり、信頼性があります
私が見た他のすべてと比較して、それは私が試したどんなURLでも動作します!!!
ご覧のページを解析するこのコードをご覧ください!
http://internet-portal.me/domain/?dns=https://stackoverflow.com/questions/1201194/php-getting-domain-name-from-subdomain/6320437#6320437

=============================================== ==================================

<*>GET['dns']); $host = $host . '/'; // needed if URL does not have trailing slash // Strip www, http, https header ; $host = str_replace( 'http://www.' , '' , $host ); $host = str_replace( 'https://www.' , '' , $host ); $host = str_replace( 'http://' , '' , $host ); $host = str_replace( 'https://' , '' , $host ); $pos = strpos($host, '/'); // find any sub directories $host = substr( $host, 0, $pos ); //strip directories $hostArray = explode (".", $host); // count parts of TLD $size = count ($hostArray) -1; // really only need to know if not a single level TLD $tld = $hostArray[$size]; // do we need to parse the TLD any further - // remove subdomains? if ($size > 1) { if ($tld == "aero" or $tld == "asia" or $tld == "biz" or $tld == "cat" or $tld == "com" or $tld == "coop" or $tld == "edu" or $tld == "gov" or $tld == "info" or $tld == "int" or $tld == "jobs" or $tld == "me" or $tld == "mil" or $tld == "mobi" or $tld == "museum" or $tld == "name" or $tld == "net" or $tld == "org" or $tld == "pro" or $tld == "tel" or $tld == "travel" or $tld == "tv" or $tld == "ws" or $tld == "XXX") { $host = $hostArray[$size -1].".".$hostArray[$size]; // parse to 2 level TLD } else { // parse to 3 level TLD $host = $hostArray[$size -2].".".$hostArray[$size -1].".".$hostArray[$size] ; } }

すべての国のTLDをリストする必要はありません。IANAによってリストされた特別な国以外は、すべて2文字です

https://gist.github.com/pocesar/5366899

およびテストはこちら http://codepad.viper-7.com/QfueI0

包括的なテストスーツと作業コード。唯一の注意点は、Unicodeドメイン名では機能しないことですが、それは別のレベルのデータ抽出です。

リストから、以下に対してテストしています:

$urls = array(
'www.example.com' => 'example.com',
'example.com' => 'example.com',
'example.com.br' => 'example.com.br',
'www.example.com.br' => 'example.com.br',
'www.example.gov.br' => 'example.gov.br',
'localhost' => 'localhost',
'www.localhost' => 'localhost',
'subdomain.localhost' => 'localhost',
'www.subdomain.example.com' => 'example.com',
'subdomain.example.com' => 'example.com',
'subdomain.example.com.br' => 'example.com.br',
'www.subdomain.example.com.br' => 'example.com.br',
'www.subdomain.example.biz.br' => 'example.biz.br',
'subdomain.example.biz.br' => 'example.biz.br',
'subdomain.example.net' => 'example.net',
'www.subdomain.example.net' => 'example.net',
'www.subdomain.example.co.kr' => 'example.co.kr',
'subdomain.example.co.kr' => 'example.co.kr',
'example.co.kr' => 'example.co.kr',
'example.jobs' => 'example.jobs',
'www.example.jobs' => 'example.jobs',
'subdomain.example.jobs' => 'example.jobs',
'insane.subdomain.example.jobs' => 'example.jobs',
'insane.subdomain.example.com.br' => 'example.com.br',
'www.doubleinsane.subdomain.example.com.br' => 'example.com.br',
'www.subdomain.example.jobs' => 'example.jobs',
'test' => 'test',
'www.test' => 'test',
'subdomain.test' => 'test',
'www.detran.sp.gov.br' => 'sp.gov.br',
'www.mp.sp.gov.br' => 'sp.gov.br',
'ny.library.museum' => 'library.museum',
'www.ny.library.museum' => 'library.museum',
'ny.ny.library.museum' => 'library.museum',
'www.library.museum' => 'library.museum',
'info.abril.com.br' => 'abril.com.br',
'127.0.0.1' => '127.0.0.1',
'::1' => '::1',
);

既に述べたように、公開サフィックスリストは、ドメインを正しく解析するための唯一の方法です。 TLDExtract パッケージをお勧めします。サンプルコードは次のとおりです。

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('here.example.com');
$result->getSubdomain(); // will return (string) 'here'
$result->getHostname(); // will return (string) 'example'
$result->getSuffix(); // will return (string) 'com'

ホストからサブドメインを抽出する方法は2つあります:

  1. より正確な最初の方法は、TLDSのデータベースを使用することです( public_suffix_list.datなど) )、ドメインを一致させます。これは、場合によっては少し重いです。 php-domain-parser TLDExtract

  2. 2番目の方法は最初の方法ほど正確ではありませんが、非常に高速であり、多くの場合正しい答えを出すことができます。

    function get_domaininfo($url) {
        // regex can be replaced with parse_url
        preg_match("/^(https|http|ftp):\/\/(.*?)\//", "$url/" , $matches);
        $parts = explode(".", $matches[2]);
        $tld = array_pop($parts);
        $host = array_pop($parts);
        if ( strlen($tld) == 2 && strlen($host) <= 3 ) {
            $tld = "$host.$tld";
            $host = array_pop($parts);
        }
    
        return array(
            'protocol' => $matches[1],
            'subdomain' => implode(".", $parts),
            'domain' => "$host.$tld",
            'host'=>$host,'tld'=>$tld
        );
    }
    

    例:

    print_r(get_domaininfo('http://mysubdomain.domain.co.uk/index.php'));
    

    戻り値:

    Array
    (
        [protocol] => https
        [subdomain] => mysubdomain
        [domain] => domain.co.uk
        [host] => domain
        [tld] => co.uk
    )
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top