Question

Je dois écrire une fonction pour analyser les variables qui contiennent des noms de domaine. Il est préférable que j'explique cela avec un exemple, la variable pourrait contenir l'une des choses suivantes:

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

Mais lorsqu'ils sont transmis via ma fonction, ils doivent tous renvoyer exemple.com ou exemple.co.uk, le nom de domaine racine. Je suis sûr que je l'ai déjà fait auparavant, mais je fais une recherche sur Google depuis environ 20 minutes et je ne trouve rien. Toute aide serait la bienvenue.

EDIT: Ignorez le fichier .co.uk, supposez que tous les domaines passant par cette fonction possèdent un TLD de 3 lettres.

Était-ce utile?

La solution

Archive de questions 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;
}

Autres conseils

Je voudrais faire quelque chose comme ce qui suit:

// 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)));

J'ai fini par utiliser la base de données de Mozilla.

Voici mon code:

fetch_mozilla_tlds.php contient un algorithme de mise en cache. Cette ligne est importante:

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

Le fichier principal utilisé dans l'application est le suivant:     

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;
}

UPDATE:
La base de données a évolué et est maintenant disponible sur son propre site Web: http://publicsuffix.org/

.

Si vous souhaitez une solution simple et rapide, sans appel externe ni vérification par rapport à des tableaux prédéfinis. Fonctionne pour de nouveaux domaines tels que "www.domain.gallery". aussi, contrairement à la réponse la plus populaire.

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 - > domain.com
  • sub.domain.com - > domain.com
  • www.domain.com - > domain.com
  • www.sub.domain.com - > domain.com
  • domain.co.uk - > domain.co.uk
  • sub.domain.co.uk - > domain.co.uk
  • www.domain.co.uk - > domain.co.uk
  • www.sub.domain.co.uk - > domain.co.uk
  • domain.photography - > domain.photography
  • www.domain.photography - > domain.photography
  • www.sub.domain.photography - > domain.photography

Presque certainement, ce que vous recherchez est le suivant:

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

Il s’agit d’une bibliothèque PHP qui utilise la liste complète (de la manière la plus pratique possible) des différents TLD collectés sur publicsuffix.org/list/, et l’enveloppe dans une petite fonction époustouflante.

Une fois la bibliothèque incluse, c’est aussi simple que:

$ registeredDomain = getRegisteredDomain ($ domaine);

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

Ce script génère un fichier Perl contenant une seule fonction, get_domain, à partir du fichier ETLD. Donc, disons que vous avez des noms d’hôtes tels que img1, img2, img3, ... dans .photobucket.com. Pour chacun de ceux-ci get_domain $ host retournera photobucket.com. Notez que ce n’est pas la fonction la plus rapide au monde. Par conséquent, dans mon analyseur principal de journal, je conserve un hachage des mappages d’hôte sur domaine et ne l’exécute que pour les hôtes ne figurant pas encore dans le hachage.

#!/bin/bash

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

sub get_domain {
  

Ce script génère un fichier Perl contenant une seule fonction, get_domain, à partir du fichier ETLD. Donc, disons que vous avez des noms d’hôtes tels que img1, img2, img3, ... dans .photobucket.com. Pour chacun de ceux-ci get_domain $ host retournera photobucket.com. Notez que ce n’est pas la fonction la plus rapide au monde. Par conséquent, dans mon analyseur principal de journal, je conserve un hachage des mappages d’hôte sur domaine et ne l’exécute que pour les hôtes ne figurant pas encore dans le hachage.

<*> = 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

C’est un moyen simple d’y parvenir:

$host = 

C’est un moyen simple d’y parvenir:

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

Ceci n'est pas infaillible et ne devrait vraiment être utilisé que si vous savez que le domaine ne sera pas obscur, mais qu'il est plus facile à lire que la plupart des autres options:

$justDomain = 

Ceci n'est pas infaillible et ne devrait vraiment être utilisé que si vous savez que le domaine ne sera pas obscur, mais qu'il est plus facile à lire que la plupart des autres options:

<*>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 pourrait vous aider. Essayez quelque chose comme ça:

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

Je pense que votre problème est que vous n'avez pas clairement défini ce que vous voulez que la fonction fasse exactement. D'après vos exemples, vous ne voulez certainement pas qu'il retourne aveuglément les deux ou trois derniers composants du nom, mais il ne suffit pas de savoir ce qu'il ne devrait pas faire.

Voici ce que je veux vraiment savoir: il existe certains noms de domaine de second niveau, tels que co.uk. , pour lesquels vous souhaitez être traité comme un seul TLD (domaine de premier niveau). domaine) aux fins de cette fonction. Dans ce cas, je suggérerais d'énumérer tous ces cas et de les placer comme clés dans un tableau associatif avec des valeurs factices, ainsi que tous les domaines de premier niveau normaux tels que com. , net. , info. , etc. Chaque fois que vous obtenez un nouveau nom de domaine, extrayez les deux derniers composants et voyez si la chaîne résultante est dans votre tableau en tant que clé. Sinon, extrayez seulement le dernier composant et assurez-vous qu'il est bien dans votre tableau. (Même si ce n'est pas le cas, ce n'est pas un nom de domaine valide) Quoi qu'il en soit, quelle que soit la clé trouvée dans le tableau, prenez ce composant plus un composant supplémentaire à la fin du nom de domaine et vous aurez votre domaine de base.

Vous pourriez peut-être simplifier un peu les choses en écrivant une fonction au lieu d'utiliser un tableau associatif, pour indiquer si les deux derniers composants doivent être traités comme un seul "TLD effectif". La fonction examinerait probablement l'avant-dernier composant et, si elle est inférieure à 3 caractères, déciderait qu'elle devrait être traitée comme faisant partie du TLD.

Pour bien le faire, vous aurez besoin d'une liste des domaines de second niveau et des domaines de niveau supérieur, ainsi que de la liste d'expressions régulières appropriée. Une bonne liste de domaines de second niveau est disponible à l'adresse https://wiki.mozilla.org/TLD_List . Le Vatican est un autre test en plus des variantes susmentionnées de CentralNic .uk.com: leur site Web est techniquement situé à l'adresse http: // va : et c’est difficile à égaler!

S'appuyant sur la réponse de Jonathan:

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;
}

Son expression est peut-être un peu meilleure, mais cette interface ressemble plus à ce que vous décrivez.

Ah, si vous voulez juste gérer des domaines de premier niveau à trois caractères, alors ce code fonctionne:

<?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";
 }
}
?>

$ correspondances [1] / $ correspondances [2] contiendra n'importe quel sous-domaine et / ou protocole, $ correspondances [3] contient le nom de domaine, $ correspondances [4] le domaine de premier niveau et $ correspondances [5] contient toutes autres informations sur le chemin d’URL.

Pour faire correspondre les domaines de premier niveau les plus courants, vous pouvez essayer de le remplacer par:

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

Ou pour le faire face à tout:

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 etc

Basé sur http://www.cafewebmaster.com/ trouver-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;
    }



}

En variante de Jonathan Sampson

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;
}

Voici ce que j'utilise: Cela fonctionne très bien sans avoir besoin de tableaux pour tld's

$split = array_reverse(explode(".", 

Voici ce que j'utilise: Cela fonctionne très bien sans avoir besoin de tableaux pour tld's

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

Voici ce que j'utilise: Cela fonctionne très bien sans avoir besoin de tableaux pour tld's

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

Il n’est pas possible de comparer avec une liste de TLD car ils existent dans de nombreux cas tels que http://www.db.de/ ou http://bbc.co.uk/

Mais même dans ce cas, les SLD ne donneront pas toujours des résultats probants. comme http://big.uk.com/ ou http://www.uk.com/

Si vous avez besoin d'une liste complète, vous pouvez utiliser la liste de suffixes publics :

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

N'hésitez pas à utiliser ma fonction. Il n'utilisera pas de regex et c'est rapide:

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

Voici comment supprimer le TLD de n'importe quelle URL - J'ai écrit le code pour qu'il fonctionne sur mon site:
http://internet-portal.me/ - Il s'agit d'une solution de travail utilisée sur mon site.

$ host est l'URL qui doit être analysée. Ce code est une solution simple et fiable
comparé à tout ce que j'ai vu, cela fonctionne sur toutes les URL que j'ai essayées !!!
voyez ce code en analysant la page que vous regardez en ce moment!
http://internet-portal.me/domain/?dns=https://stackoverflow.com/questions/1201194/php-getting-domain-name-from-subdomain/6320437#6320437

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

$host = filter_var(

Voici comment supprimer le TLD de n'importe quelle URL - J'ai écrit le code pour qu'il fonctionne sur mon site:
http://internet-portal.me/ - Il s'agit d'une solution de travail utilisée sur mon site.

$ host est l'URL qui doit être analysée. Ce code est une solution simple et fiable
comparé à tout ce que j'ai vu, cela fonctionne sur toutes les URL que j'ai essayées !!!
voyez ce code en analysant la page que vous regardez en ce moment!
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] ; } }

Pas besoin de lister tous les pays TLD, ce sont toutes les 2 lettres, en plus des lettres spéciales listées par IANA

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

et les tests sont ici http://codepad.viper-7.com/QfueI0

Combinaison de test complète avec code de travail. Le seul inconvénient est que cela ne fonctionnera pas avec les noms de domaine unicode, mais c'est un autre niveau d'extraction de données.

Dans la liste, je teste contre:

$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',
);

Comme déjà dit, la liste des suffixes publics n'est qu'une des façons d'analyser correctement le domaine. Je recommande le package TLDExtract , voici un exemple de code:

$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'

Il existe deux manières d'extraire un sous-domaine d'un hôte:

  1. La première méthode la plus précise consiste à utiliser une base de données de tld (telle que public_suffix_list.dat ) et associez le domaine à celui-ci. C'est un peu lourd dans certains cas. Il existe certaines classes PHP pour l'utiliser telles que analyseur de domaine php et TLDExtract .

  2. La deuxième façon n'est pas aussi précise que la première, mais elle est très rapide et peut donner la bonne réponse dans de nombreux cas, j'ai écrit cette fonction pour cela:

    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
        );
    }
    

    Exemple:

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

    Retourne:

    Array
    (
        [protocol] => https
        [subdomain] => mysubdomain
        [domain] => domain.co.uk
        [host] => domain
        [tld] => co.uk
    )
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top