База номеров по регионам на PHP
Возникла тут задача: написать API для партнерской программы. При этом в партнёрской программе принимается и обрабатывается номер телефона – как мобильный, так и стационарный. Необходимо было на PHP написать скрипт, который будет по номеру (коду) определять регион. Что ж надо – значит сделаем.
Сначала я решил задачу до смешного просто. Нашел сайт, который делает тоже самое (определяет оператора и регион по номеру) и стал слать ему запросы курлом – затем парсить ответы. Получился такой код:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://phonenum.info/phone/'.$phone); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); $html = str_get_html($result); foreach($html->find('.itemprop_answer') as $element) { $region = $element->innertext; $region = mb_substr($region, mb_strpos($region, "Регион: ")); $region = mb_substr($region, 8); $region = mb_substr ($region, 0, mb_strrpos($region, "Местное время")); $region = strip_tags ($region); if ($region=="") $region = "Неизвестен"; }Ну реально код простейший. Шлем пост запрос, затем с помощью simple html dom парсим, немного обрезаем и получаем ответ в формате: Вологодская обл
Однако, заказчик совсем не обрадовался такому решению. В общем, его можно понять – зависеть от постороннего сайта не очень правильно, даже если сайт не собирается закрываться и не имеет защиты. Ладно, ищем другое решение. Собственно, оно только одно: нужна своя база и поиск по ней.
База нашлась. В формате страницы html, но это совсем не проблема. Распарсиваем и заносим её в таблицу:
Ну а остальное уже дело техники. Просто сравниваем коды, а оставшаяся часть чтобы входила в емкость (находилась между от и до):
$kod = mb_substr($phone,0,3); $otdo = mb_substr($phone,3,9); $result_tel = $conn->query("SELECT * FROM `region` WHERE `kod` = '".$kod."' AND `ot` < '".$otdo."' AND `do` > '".$otdo."' "); $row_tel = $result_tel->fetch_assoc(); $region = $row_tel["region"]; if ($region=="") $region = "Неизвестен";Казалось бы, теперь задача решена. Однако, не совсем. В поле номер телефона человек же может указать и не мобильный, верно? То есть нужна аналогичная база для стационарных телефонов по определению региона.
Создаем почти аналогичную базу данных
А вот код будет немного другим.
$region = "Неизвестен"; $result_tel = $conn->query("SELECT * FROM `regiondom` "); while ($row_tel = $result_tel->fetch_assoc()) { $pos2 = false; $pos2 = stripos($phone, $row_tel["kod"]); if ($pos2 !== false) { if ($pos2==0) $region = $row_tel["region"]; } }Здесь мы уже напротив, сравниваем код в базе, входит ли он в часть номера телефона. И обязательно чтобы он был в начале.
Все, задача решена. Если вам требуется запустить сервис на сайте (необязательно использующий номера телефонов), то вы можете обратиться ко мне. За небольшую сумму я вам с удовольствием помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.