dominios de primer nivel y dominios de segundo nivel pueden tener 2 caracteres de longitud pero un subdominio registrado debe tener al menos 3 caracteres de longitud.
EDIT: debido al comentario de pjv, aprendí que los nombres de dominio australianos son una excepción porque permiten 5 TLD como SLD (com, net, org, asn, id) ejemplo: somedomain.com.au. Supongo que com.au es un nombre de dominio controlado nacionalmente que "comparte". entonces, técnicamente, "com.au" aún sería el "dominio base", pero eso no es útil.
EDITAR: hay 47,952 nombres de dominio de tres letras posibles (patrón: [a-zA-Z0-9] [a-zA-Z0-9 -] [a-zA-Z0-9] o 36 * 37 * 36) combinado con solo 8 de los TLDS más comunes (com, org, etc.) tenemos 383,616 posibilidades, sin siquiera agregar todo el alcance de los TLD. Los nombres de dominio de 1 y 2 letras aún existen, pero no son válidos en el futuro.
en google.com - "google" es un subdominio de "com"
en google.co.uk - "google" es un subdominio de "co", que a su vez es un subdominio de "Reino Unido", o un dominio de segundo nivel realmente, ya que "co" también es un dominio de nivel superior válido
en www.google.com - "www" es un subdominio de "google" que es un subdominio de "com"
"co.uk" no es un host válida porque no hay un nombre de dominio válido
ir con esa assumpt Esta función devolverá el "dominio basado" apropiado en casi todos los casos, sin requerir un "mapa de url".
Si usted es uno de los pocos casos, quizás pueda modificar esto para satisfacer sus necesidades particulares ...
EDITAR: debe pasar la cadena del dominio como una URL con su protocolo (http: //, ftp: //, etc.) o parse_url()
no lo considerará una URL válida (a menos que desee modificar el código para comportarse de manera diferente)
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));
}
si tiene que ser el uso exacto fopen
o curl
para abrir esta URL: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
luego leer las líneas en una matriz y utilizar eso para comparar las partes dominio
EDIT: para permitir dominios de Australia:
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));
}
NOTAS ADICIONALES IMPORTANTE: No utilizar esta función para validar dominios. Es un código genérico que solo uso para extraer el dominio base para el servidor en el que se ejecuta desde el $_SERVER['SERVER_NAME']
global para su uso dentro de varios scripts internos. Teniendo en cuenta que solo he trabajado en sitios dentro de los EE. UU., Nunca me he encontrado con las variantes australianas sobre las que pjv preguntó. Es útil para uso interno, pero está muy lejos de un proceso completo de validación de dominio. Si está intentando usarlo de esta forma, le recomiendo que no lo haga porque hay demasiadas posibilidades para unir dominios no válidos.
Esto es complicado. Para 'google.com', le interesan los nombres de dominio de segundo nivel y TLD. Para 'google.co.uk', desea los nombres de dominio de TLD y segundo y tercer nivel. No hay un "nombre base" definido, lo que quiere decir con "nombre base" es diferente para los diferentes registradores/TLD. – deceze
Estoy bastante seguro de que tienes que ponerte un poco largo aquí, lo que estás pidiendo es comer tu torta y tenerla también. Sin una lista de TLD no hay forma de diferenciar entre co.uk y google.com, ambos son el nombre de host. –
Supongo que ustedes tienen razón, no parece que nada va a funcionar sin un montón de código – Rohan