Проверка, ввел ли пользователь доменное имя или только базу

Я хочу создать что-то, что делает запрос WHOIS, чтобы узнать, доступен ли домен. Сейчас я нашел довольно много готовых скриптов для этого, но все они вроде одинаковы в том, что нужно указать базу, а потом выбрать какие расширения нужны и он это сделает (так например , введите «test», проверьте .com, и он проверит, доступен ли test.com)

Тем не менее, я пытаюсь сделать что-то немного другое. Я хочу, чтобы он проверял, ввел ли пользователь только базовый или полный URL-адрес, а затем выполнял один или несколько запросов соответственно. Пример:

Если пользователь вводит «test», я хочу, чтобы скрипт проверял наличие test.com, test.org, test.net и т. д. Если пользователь вводит «test.com», я хочу, чтобы скрипт проверял ТОЛЬКО test.com .

Я действительно не знаю, на чем основываться, но скрипт PHP Whois Майка Нотта выглядит нормально. Конечно, предложения всегда приветствуются.

Теперь я предполагаю, что поток сценария должен выглядеть примерно так:

  1. Пользователь вводит запрос
  2. Скрипт проверяет наличие пробелов
  3. Скрипт проверяет, ввел ли пользователь только базовое или полное доменное имя (я предполагаю, что способ сделать это - проверить, есть ли там точка)
  4. Если пользователь ввел полное доменное имя, разделите базу и TLD и сохраните их оба в переменных и где-нибудь сохраните «статус» ($full = true/false)
  5. if ($full = true) {проверить соответствующие серверы whois для $base.com, $base.net и т. д.};
  6. if ($full != true) {посмотрите, какой сервер подходит для $tld, и проверьте его для $base.$tld}
  7. Выходные результаты

Конечно, если уже есть скрипт, который это делает, дайте мне знать.

Редактировать: Просто чтобы вы знали, я могу делать простые операторы if и тому подобное, но шаги 3, 4, 5 и 6 в моем «рабочем процессе» — это части, которые я не могу понять.

Редактировать 2: Спасибо за все ваши ответы, ребята! Теории Маркуса Адама действительно верны. Мой реселлер доменов (парни, у которых я получаю свои домены) не предлагает TLD второго уровня, такие как .co.uk, так что это не проблема. Они также не поддерживают IDN.

Из ваших ответов, ребята, я пришел к выводу, что функция взрыва используется для разделения доменного имени. Однако что будет делать взрыв, когда он столкнется с несколькими точками? Я предполагаю, что это просто добавит еще одну запись в массив, но это вызовет проблемы. Потому что, если пользователь затем вводит (например) домен, оканчивающийся на .co.uk, сценарий примет «co» в качестве TLD.

Проверка наличия более 2 строк в массиве также не вариант (я думаю), потому что, если пользователь затем вводит «sub.domain.com», сценарий примет «sub» в качестве базы и «domain.com» в качестве ДВУ.

Кроме того, Маркус Адамс, вы говорите, что если сервер whois показывает «доступен», это не гарантирует, что он доступен, и я должен запросить у регистратора. Но как бы я это сделал? Любые идеи?

Спасибо, парни :)


person Jamy Mahabier    schedule 23.11.2011    source источник
comment
Of course, if there's a script that does this already, let me know. Бьюсь об заклад, да есть   -  person Martin.    schedule 24.11.2011
comment
Возможно, да, но существуют буквально сотни сценариев, и просмотр только первых 10, которые я нашел, ничего не дал мне. Так что я предполагаю, что спросить вас, ребята, это лучший вариант, чем копаться во всех этих сценариях, пытаясь найти тот, который соответствует тому, что я ищу: P   -  person Jamy Mahabier    schedule 24.11.2011
comment
см. мой ответ для шага 3, хотя, если это ваш первый проект, выберите что-то более простое для изучения   -  person Drahcir    schedule 24.11.2011


Ответы (4)


Я реализовал такой код, но не на PHP. Вот что я узнал.

Алгоритм

Будьте осторожны, потому что некоторые домены могут иметь домены верхнего уровня первого и второго уровня. Например example.in и example.co.in.

Я рекомендую сначала обрезать домены начальных и конечных пробелов и преобразовать их в нижний регистр.

Поскольку у многих TLD есть собственный whois-сервер, вы также можете создать таблицу или массив всех возможных TLD, конечно, в нижнем регистре.

Затем вы проверяете, есть ли период. Если месячных нет, то дальше делать нечего.

Если есть точка, вы должны извлечь TLD. Начните с левой стороны и найдите первый период. Разделите строку там. Если правая часть соответствует одному из TLD в списке, то все, что слева, было именем, а все, что справа, было TLD. Если нет совпадения TLD, перейдите к следующему периоду и повторяйте, пока не найдете совпадение или не закончатся периоды.

Если вы не можете найти совпадение, значит, они не ввели действительный домен. Вы можете попробовать разделить последний период справа, потому что, возможно, они ввели www.wiki.example.

Если вы найдете совпадение, вам все равно придется посмотреть, есть ли еще одна точка в левой части разделения, и обрезать ее или признать ее недействительной.

Поиск сервера whois

IANA предоставляет базовую информацию о каждом TLD, включая сервер whois.

База данных корневой зоны

Обратите внимание, что вы, вероятно, будете создавать регулярные выражения для оценки результатов каждого сервера whois, поскольку результаты не стандартизированы.

База данных Whois отличается от базы данных регистратора

Вы не можете полагаться на доступность домена только потому, что сервер whois сообщает, что он «доступен». В большинстве случаев он будет точным, но не обещайте пользователю, что он сможет его зарегистрировать. Вы должны запросить регистратора, чтобы узнать, доступен ли домен.

Наиболее заметным исключением является ситуация, когда домен собирается удалить. Есть период до суток, когда на whois-сервере не будет о нем записи, но он еще не вышел из регистратора.

Интернационализированные доменные имена

Планируете ли вы поддерживать IDN?

person Marcus Adams    schedule 23.11.2011

Не существует алгоритмического метода нахождения наивысшего уровня, на котором домен может быть зарегистрирован для конкретного домена верхнего уровня (политики различаются для каждого реестра), единственный метод — создать список всех доменов верхнего уровня и уровень на которых можно регистрировать домены.

Это основная причина, по которой закрывается список общедоступных суффиксов.

Используя определения, собранные в этом списке, вы можете легко разобрать доменное имя на его части, извлекая TLD, домен и субдомен.

person Simone Carletti    schedule 22.12.2011

Лучший способ проверить — перебрать все возможные расширения домена, разбить строку с помощью взрыва, а затем проверить все, что идет после точки.

Это для шага 3 и 4:

function isFullDomain($domain){
    $domain=explode('.', $domain);
    foreach($possibleDomainExts as $ext){
        if($ext==$domain[count($domain)-1) return $ext;
    }
    return false;
}

назовите это так:

if(!$ext=isFullDomain($domain)){
    //is only the base
}
else{
    //is the full domain and $ext will hold the value of the domain extension
}

У вас уже есть этот PHP-скрипт whois, поэтому разберите его, чтобы получить список возможных доменов, а также получить помощь в шагах 5 и 6.

person Drahcir    schedule 23.11.2011

Я не уверен, что для этого уже существует сценарий, но предложенное вами решение будет работать.

Если предположить, что вся логика поиска whois находится в методе с именем check_whois($base, $tld), решение может выглядеть примерно так:

$pieces = explode(".", $user_input);
$base = $pieces[0];
$tld = $pieces[1];
if ($tld == null) {
  $default_tlds = array("com","net","org");
  foreach( $default_tlds as $tld ) {
    check_whois($base, $tld);
  }
} else {
  check_whois($base, $tld);
}
person Carl Zulauf    schedule 23.11.2011