Валидация, форматирование и проверка домена по WHOIS с помощью php

regex domain check

Для одного из своих проектов мне нужно было выполнять валидацию домена с последующей проверкой по 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;
 }
 
}

 }

}
?>

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

Смотрите так же   Sebastiancorp SQL инъекция и новости с хакера.

В случае, если наш домен совпадает с .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 у многих сервисов выполняется только с доменами в нижнем регистре.

 

Может быть интересно:

One Comment

Добавьте комментарий