Домены верхнего уровня и домены второго уровня могут иметь длину 2 символа, но зарегистрированный субдомен должен иметь длину не менее 3 символов.
EDIT: из-за комментария pjv я узнал, что австралийские доменные имена являются исключением, поскольку они позволяют 5 TLDs как SLD (com, net, org, asn, id) example: somedomain.com.au. Я предполагаю, что com.au является государственным доменным именем, которое «разделяет». так что технически «com.au» все равно будет «базовым доменом», но это не полезно.
EDIT: существует 47 952 возможных трехбуквенных доменных имени (шаблон: [a-zA-Z0-9] [a-zA-Z0-9 -] [a-zA-Z0-9] или 36 * 37 * 36) в сочетании с 8 наиболее распространенными TLDS (com, org и т. Д.) У нас есть 383 616 возможностей - даже не добавляя во весь диапазон TLD. Однобуквенные и двухбуквенные имена доменов все еще существуют, но недействительны в будущем.
в google.com - «Google» является поддомен «ком»
в google.co.uk - «Google» является поддомен «со», который, в свою очередь, является подобласть «uk» или домен второго уровня, так как «co» также является допустимым доменом верхнего уровня.
на www.google.com - «www» является поддоменом «google», который является поддоменом из «ком»
«co.uk» не является действительным хозяином, потому что нет допустимого доменного имени
собирается с этим assumpt иона эта функция вернет правильный «basedomain» почти во всех случаях, не требуя «карты url».
Если вы оказались в одном из редких случаев, возможно, вы можете изменить это, чтобы удовлетворить особые потребности ...
EDIT: вы должны передать доменную строку в виде URL-адреса с его протоколом (http: //, ftp: // и т. Д.) Или parse_url()
не будет считать его действительным URL-адресом (если вы не хотите изменять код, чтобы вести себя по-разному)
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));
}
, если вам нужно, чтобы быть точным использование fopen
или curl
открыть этот URL: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
затем читать строки в массив и использовать его для сравнения частей домена
EDIT: чтобы для австралийских доменов:
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));
}
ВАЖНЫЕ ДОПОЛНИТЕЛЬНЫЕ ПРИМЕЧАНИЯ: Я не использую эту функцию для проверки доменов. Это общий код, который я использую только для извлечения базового домена для сервера, на котором он запущен, от глобального $_SERVER['SERVER_NAME']
для использования в различных внутренних сценариях. Учитывая, что я когда-либо работал на сайтах в США, я никогда не сталкивался с австралийскими вариантами, о которых спрашивал pjv. Это удобно для внутреннего использования, но это далеко от полного процесса проверки домена. Если вы пытаетесь использовать его таким образом, я рекомендую не использовать слишком много возможностей для соответствия недопустимым доменам.
Это сложно. Для 'google.com' вас интересует доменное имя и доменное имя второго уровня. Для 'google.co.uk' вам нужны доменные имена домена и второго и третьего уровня. Нет определенного «базового имени», то, что вы подразумеваете под «базовым именем», различно для разных регистраторов/TLD. – deceze
Я уверен, что вам нужно немного задержаться здесь, то, что вы просите, это есть ваш торт и иметь его тоже. Без списка TLD нет возможности различать co.uk и google.com, они оба являются именами хостов. –
Я думаю, вы, ребята, правы, это не похоже, что все будет работать без большого количества кода – Rohan