Валидация, форматирование и проверка домена по WHOIS с помощью php
Для одного из своих проектов мне нужно было выполнять валидацию домена с последующей проверкой по WHOIS, но была еще одна тонкость — надо было определять еще доменную зону, в случае одной доменной зоны — обращаться к одному провайдеру WHOIS, в случае с другой — к другому (речь идет о байнете).
Сервисы которые я решил использовать для выполнения проверки доменов:
- cctld.by для белорусских доменов
- freewhois.us для все остальных доменов
Решение нужно было на php и конечно же, не без регулярных выражений.
Писать будем сразу тестовый скрипт.
На первом этапе давайте определимся, что это будет функция, а передавать мы будем параметр «domain».
<?php
$domain = trim($_GET['domain']);
if(isset($domain)) {
. . .
}
?>
На втором шаге добавляем функцию, которая будет отвечать за выполнение всех проверок с переданным в запросе доменом:
<?php
$domain = domainCheck(trim($_GET['domain']));
if(isset($domain)) {
function domainCheck($domain) {
$detect_zone = preg_match("/.+\.(\w{2,5})/", $domain, $zoneMatch);
$validate_domain = preg_match("/([a-z0-9\-]+\.[a-z]{2,6})$/i", strtolower($domain), $match);
}
}
?>
Переменная $detect_zone отвечает за определение доменной зоны (прим.: BY или все остальные) для того, чтобы правильно определить оператора WHOIS к которому мы в последствии будем обращаться.
$validate_domain — выполняет проверку и отдает нам домен второго уровня даже в том случае, если вы захотите выполнить проверку доменов третьего уровня (саб-доменов) или выше. Это нужно для того, чтобы корректно отправить whois запрос. Такая практика применительна не во всех случаях, потому как, домен можно регистрировать к примеру третьего уровня — site.co.uk , но в моем случае такой подход подходил как нельзя лучше.
Далее, мы будем использовать php cURL для отправки запросов и регулярные выражения для получения нужной информации из ответов:
<?php
$domain = domainCheck(trim($_GET['domain']));
if(isset($domain)) {
function domainCheck($domain) {
$detect_zone = preg_match("/.+\.(\w{2,5})/", $domain, $zoneMatch);
$validate_domain = preg_match("/([a-z0-9\-]+\.[a-z]{2,6})$/i", strtolower($domain), $match);
if($zoneMatch[1] == 'by' || $zoneMatch == 'бел') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://cctld.by/check/?domain=".$match[1]);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$lookup = curl_exec($ch);
curl_close ($ch);
$get_mail = preg_match("/(\D+[-a-z0-9]+\@.+?\.\w{2,5})/", $lookup, $emailMatch);
$phone_match = preg_match("/\>(\+\d{12})/", $lookup, $phoneMatch);
$data = $emailMatch[1].";".$phoneMatch[1];
} else {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.freewhois.us/index.php?query=".$match[1]."&submit=Whois");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$lookup = curl_exec($ch);
curl_close ($ch);
$get_mail = preg_match("/([-a-z0-9]+\@.+?\.\w{2,5})/", $lookup, $emailMatch);
$phone_match = preg_match("/.+(\+\d{3}\.\d+)/", $lookup, $phoneMatch);
$data = $emailMatch[1].";".$phoneMatch[1];
}
$error = 'none';
if($emailMatch[1] && $phoneMatch[1]) {
return $data;
} else {
return $error;
}
}
}
}
?>
Используем простое условие, которое при определении доменной зоне будет выполнять нужный нам сценарий.
В случае, если наш домен совпадает с .BY или .БЕЛ, значит мы будем обращаться к cctld.by, в остальных случаях соответственно — будет использоваться второй сервис.
$get_mail = preg_match("/(\D+[-a-z0-9]+\@.+?\.\w{2,5})/", $lookup, $emailMatch);
Переменная $get_mail помогает нам получить электронный адрес владельца домена, а переменная $phone_match — забирает в свою очередь номер телефона. Так как разметка страницы у операторов whois отличается, регулярные выражения подстраиваются индивидуально.
$phone_match = preg_match("/\>(\+\d{12})/", $lookup, $phoneMatch);
В случае, если домена нет или какой-то информации не хватает — создаем переменную $error и отдаем ее.
$validate_domain = preg_match("/([a-z0-9\-]+\.[a-z]{2,6})$/i", strtolower($domain), $match);
При выполнении проверки регулярным выражением, нам важно, чтобы домен был с маленькой буквы, для этого используем функцию strtolower(), потому как проверка whois у многих сервисов выполняется только с доменами в нижнем регистре.
Может быть интересно:
Добавьте комментарий
Для отправки комментария вам необходимо авторизоваться.


скриптик оказался полезным, благодарю