Как проверить номера телефонов в PHP: от регулярных выражений до API доступности

Как проверить номера телефонов в PHP: от регулярных выражений до API доступности

Полное руководство по проверке номеров телефонов в PHP. Узнайте, как форматировать их с помощью libphonenumber-for-php и проверять доступность через REST API.

Чтобы проверить номер телефона в PHP, сначала отформатируйте введенные данные с помощью библиотеки giggsey/libphonenumber-for-php, чтобы убедиться, что они соответствуют стандарту E.164. Поскольку библиотеки PHP проверяют только синтаксис, затем вам необходимо использовать REST API, такой как NumberChecker.AI, для скрытой проверки того, доступна ли ваша партия номеров и зарегистрирована ли она на таких платформах, как iMessage или Viber.


Предварительные требования для проверки телефонов в PHP

Перед написанием скрипта проверки убедитесь, что ваша среда настроена как для локального форматирования, так и для удаленной проверки доступности. Вам понадобится менеджер пакетов для работы с библиотекой локального парсинга и ключ API для выполнения фактических проверок доступности в более чем 200 странах.

Убедитесь, что у вас готово следующее:

  • PHP 7.4 или выше, установленный на вашем сервере или в локальной среде.
  • Composer, установленный глобально для подключения пакета giggsey/libphonenumber-for-php.
  • Ключ API NumberChecker.AI для массовой пакетной проверки.

Выполните следующую команду в терминале, чтобы установить необходимую библиотеку форматирования:

composer require giggsey/libphonenumber-for-php

Шаг 1: Ограничения базовых регулярных выражений PHP и filter_var

Разработчики часто начинают с использования preg_match или filter_var для проверки номеров телефонов. Например, базовое регулярное выражение, такое как preg_match("/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/", $phone), может обеспечить соблюдение определенного шаблона для одного региона.

Однако эти базовые методы PHP проверяют только синтаксис и не могут подтвердить, является ли номер реальным. Использование исключительно регулярных выражений приводит к ложным срабатываниям, поскольку они не могут проверить доступность или регистрацию на платформе. Кроме того, регулярные выражения требуют постоянного обновления для адаптации к меняющимся международным форматам. Хотя filter_var отлично подходит для стандартизации целых чисел или базовых строк, ему не хватает сложных телекоммуникационных правил, необходимых для точной проверки глобальных телефонных кодов.


Шаг 2: Форматирование с помощью libphonenumber-for-php

Чтобы правильно проверить синтаксис и отформатировать номера по стандарту E.164, используйте библиотеку giggsey/libphonenumber-for-php. Библиотека giggsey/libphonenumber-for-php включает телекоммуникационные метаданные Google для правил длины и стран, гарантируя максимальную точность локальных синтаксических проверок.

Если не отформатировать номера в E.164 перед отправкой их в API, это может вызвать ошибки проверки. Следующий исполняемый PHP-код демонстрирует, как проанализировать партию необработанных входных данных и правильно их отформатировать:

require 'vendor/autoload.php';
use libphonenumber\PhoneNumberUtil;
use libphonenumber\PhoneNumberFormat;
use libphonenumber\NumberParseException;

$phoneUtil = PhoneNumberUtil::getInstance();
$rawNumbers = ['+12025550123', '07700900077', 'invalid_string'];
$formattedNumbers = [];

foreach ($rawNumbers as $number) {
    try {
        // Parse assuming US as default region if no country code is provided
        $proto = $phoneUtil->parse($number, "US");
        
        if ($phoneUtil->isValidNumber($proto)) {
            $formattedNumbers[] = $phoneUtil->format($proto, PhoneNumberFormat::E164);
        }
    } catch (NumberParseException $e) {
        // Silently skip or log invalid formats
        error_log("Error parsing $number: " . $e->getMessage());
    }
}

// $formattedNumbers now contains strictly E.164 formatted strings
print_r($formattedNumbers);

Шаг 3: Проверка доступности через REST API NumberChecker.AI

Как только ваша партия номеров отформатирована в E.164, следующим шагом является проверка фактической доступности. NumberChecker.AI предоставляет REST API для скрытой проверки доступности номеров телефонов и платформ в реальном времени. NumberChecker.AI поддерживает более 45 детекторов платформ, включая iMessage, Viber и Apple.

NumberChecker.AI разработан для массовой пакетной проверки через CSV/TXT или REST API. Например, чекер iMessage принимает минимальную партию из 2000 номеров. Важно отметить, что NumberChecker.AI выполняет скрытые проверки без уведомления владельца аккаунта.

Вот исполняемый PHP-скрипт, использующий cURL для отправки вашей отформатированной партии в API:

// Assuming $formattedNumbers contains valid E.164 numbers from Step 2
$apiKey = 'YOUR_API_KEY_HERE';
$apiUrl = 'https://api.numberchecker.ai/v1/imessage'; // Example endpoint

$payload = json_encode([
    'numbers' => $formattedNumbers
]);

$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $apiKey
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $results = json_decode($response, true);
    // Process the returned fields: Number, activated
    print_r($results);
} else {
    echo "API Request failed with HTTP status $httpCode";
}

Честные ограничения проверки телефонов

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

  • Синтаксис против доступности: Библиотеки PHP могут подтвердить только синтаксис, а не доступность. Номер может быть идеально отформатирован в соответствии с метаданными Google, но при этом быть отключенным или неактивным.
  • Требования к форматированию: Для корректной работы проверок API требуется правильное форматирование E.164. Необработанный пользовательский ввод всегда должен сначала анализироваться локально, чтобы избежать траты запросов API на некорректные строки.
  • Фокус на пакетной обработке: NumberChecker.AI — это инструмент пакетной обработки, а не инструмент для поиска одиночных номеров. Рабочие процессы должны быть разработаны для агрегирования номеров и их массовой отправки (например, партиями минимум от 1000 до 2000 в зависимости от детектора платформы), а не для выполнения отдельных HTTP-запросов при каждой регистрации пользователя.

Часто задаваемые вопросы (FAQ)

Может ли PHP встроенными средствами проверить, активен ли номер телефона?

Нет, базовые методы PHP, такие как preg_match и filter_var, проверяют только синтаксис и не могут подтвердить, является ли номер реальным или активным. Вы должны использовать сторонний API для проверки фактической доступности.

Какое регулярное выражение лучше всего подходит для международных номеров телефонов в PHP?

Использование исключительно регулярных выражений приводит к ложным срабатываниям, поскольку они не могут проверить доступность или регистрацию на платформе, и требуют постоянного обновления для международных форматов. Вместо регулярных выражений используйте библиотеку giggsey/libphonenumber-for-php для точной проверки синтаксиса.

Как отформатировать номера телефонов в E.164 в PHP?

Вы можете отформатировать номера телефонов по стандарту E.164, установив библиотеку giggsey/libphonenumber-for-php через Composer, проанализировав необработанный ввод с помощью PhoneNumberUtil::getInstance()->parse(), а затем отформатировав его с помощью PhoneNumberFormat::E164.

Начните работу с NumberChecker.AI

Попробуйте NumberChecker.AI бесплатно — 1000 проверок при регистрации, кредитная карта не требуется.

Готовы начать?

Попробуйте наш сервис валидации номеров WhatsApp и убедитесь, какую разницу дают чистые данные.

Бесплатный инструмент Связаться с нами