Top-Level-Domains und Second-Level-Domains dürfen 2 Zeichen lang sein, aber eine registrierte Subdomain muss mindestens 3 Zeichen lang sein.
EDIT: aufgrund des Kommentars von pjv habe ich erfahren, dass australische Domänennamen eine Ausnahme sind, weil sie 5 TLDs als SLDs zulassen (com,net,org,asn,id) Beispiel: somedomain.com.au. ich vermute, dass com.au ein national kontrollierter Domänenname ist, der "geteilt" wird. technisch gesehen wäre also "com.au" immer noch die "Basisdomäne", aber das ist nicht sinnvoll.
EDIT: Es gibt 47.952 mögliche Domänennamen mit drei Buchstaben (Muster: [a-zA-Z0-9][a-zA-Z0-9-][a-zA-Z0-9] oder 36 * 37 * 36). Kombiniert mit nur 8 der gebräuchlichsten TLDS (com, org usw.) ergeben sich 383.616 Möglichkeiten - ohne die gesamte Bandbreite der TLDs zu berücksichtigen. 1-Buchstaben- und 2-Buchstaben-Domänennamen gibt es zwar noch, sie sind aber nicht mehr gültig.
in google.com - "google" ist eine Unterdomäne von "com"
in google.co.uk -- "google" ist eine Unterdomäne von "co", die wiederum eine Unterdomäne von "uk" ist, oder eigentlich eine Domäne zweiter Stufe, da "co" auch eine gültige Domäne erster Stufe ist
in www.google.com -- "www" ist eine Unterdomäne von "google", die wiederum eine Unterdomäne von "com" ist
"co.uk" ist KEIN gültiger Host, da es keinen gültigen Domänennamen gibt.
Ausgehend von dieser Annahme wird diese Funktion in fast allen Fällen die richtige "basedomain" zurückgeben, ohne dass eine "url map" erforderlich ist.
Wenn Sie einer der seltenen Fälle sind, können Sie dies vielleicht ändern, um bestimmte Bedürfnisse zu erfüllen...
EDIT: Sie müssen den Domain-String als URL mit dem entsprechenden Protokoll (http://, ftp://, etc.) übergeben oder parse_url()
wird sie nicht als gültige URL betrachtet (es sei denn, Sie möchten den Code ändern, damit er sich anders verhält)
function basedomain( $str = '' )
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url( $str );
if ( empty( $url['host'] ) ) return;
$parts = explode( '.', $url['host'] );
$slice = ( strlen( reset( array_slice( $parts, -2, 1 ) ) ) == 2 ) && ( count( $parts ) > 2 ) ? 3 : 2;
return implode( '.', array_slice( $parts, ( 0 - $slice ), $slice ) );
}
Wenn Sie genau sein müssen, verwenden Sie fopen
o curl
um diese URL zu öffnen: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
dann die Zeilen in ein Array einlesen und dieses zum Vergleich der Domänenteile verwenden
EDIT: um australische Domains zu berücksichtigen:
function au_basedomain( $str = '' )
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url( $str );
if ( empty( $url['host'] ) ) return;
$parts = explode( '.', $url['host'] );
$slice = ( strlen( reset( array_slice( $parts, -2, 1 ) ) ) == 2 ) && ( count( $parts ) > 2 ) ? 3 : 2;
if ( preg_match( '/\.(com|net|asn|org|id)\.au$/i', $url['host'] ) ) $slice = 3;
return implode( '.', array_slice( $parts, ( 0 - $slice ), $slice ) );
}
WICHTIGE ZUSÄTZLICHE HINWEISE: Ich verwende diese Funktion nicht zur Validierung von Domains. Es handelt sich um generischen Code, den ich nur verwende, um die Basisdomäne für den Server, auf dem sie läuft, aus der globalen $_SERVER['SERVER_NAME']
zur Verwendung in verschiedenen internen Skripten. Da ich bisher nur an Websites in den USA gearbeitet habe, bin ich nie auf die australische Variante gestoßen, nach der pjv gefragt hat. Es ist praktisch für den internen Gebrauch, aber es ist weit entfernt von einem vollständigen Domain-Validierungsprozess. Wenn Sie versuchen, es auf diese Weise zu verwenden, empfehle ich, dies nicht zu tun, da es zu viele Möglichkeiten gibt, ungültige Domains zu finden.