Cómo validar números de teléfono en PHP: De Regex a la API de accesibilidad
Un tutorial completo de PHP sobre cómo validar números de teléfono. Aprende a formatear con libphonenumber-for-php y a verificar la accesibilidad a través de una API REST.
Para validar un número de teléfono en PHP, primero formatea la entrada utilizando la biblioteca giggsey/libphonenumber-for-php para asegurar que cumple con el estándar E.164. Debido a que las bibliotecas de PHP solo verifican la sintaxis, luego debes usar una API REST como NumberChecker.AI para verificar silenciosamente si tu lote de números es accesible y está registrado en plataformas como iMessage o Viber.
Requisitos previos para la validación de teléfonos en PHP
Antes de escribir el script de validación, asegúrate de que tu entorno esté configurado tanto para el formateo local como para las comprobaciones remotas de accesibilidad. Necesitarás un gestor de paquetes para manejar la biblioteca de análisis local y una clave API para realizar las comprobaciones reales de accesibilidad en más de 200 países.
Asegúrate de tener lo siguiente listo:
- PHP 7.4 o superior instalado en tu servidor o entorno local.
- Composer instalado globalmente para requerir el paquete
giggsey/libphonenumber-for-php. - Una clave API de NumberChecker.AI para la verificación masiva por lotes.
Ejecuta el siguiente comando en tu terminal para instalar la biblioteca de formateo necesaria:
composer require giggsey/libphonenumber-for-php
Paso 1: Los límites de Regex básico en PHP y filter_var
Los desarrolladores a menudo comienzan usando preg_match o filter_var para validar números de teléfono. Por ejemplo, una expresión regular básica como preg_match("/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/", $phone) puede imponer un patrón específico para una sola región.
Sin embargo, estos métodos básicos de PHP solo comprueban la sintaxis y no pueden confirmar si un número es real. Depender únicamente de regex conduce a falsos positivos porque no puede verificar la accesibilidad o el registro en la plataforma. Además, regex requiere una actualización constante para adaptarse a los cambiantes formatos internacionales. Aunque filter_var es excelente para estandarizar números enteros o cadenas básicas, carece de las complejas reglas de telecomunicaciones necesarias para validar con precisión los códigos de marcación globales.
Paso 2: Formateo con libphonenumber-for-php
Para validar correctamente la sintaxis y formatear los números al estándar E.164, utiliza la biblioteca giggsey/libphonenumber-for-php. La biblioteca giggsey/libphonenumber-for-php incorpora los metadatos de telecomunicaciones de Google para las reglas de longitud y país, asegurando que tus comprobaciones de sintaxis locales sean lo más precisas posible.
No formatear los números a E.164 antes de enviarlos a una API puede causar errores de validación. El siguiente código PHP ejecutable demuestra cómo analizar un lote de entradas sin procesar y formatearlas correctamente:
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);
Paso 3: Verificación de accesibilidad a través de la API REST de NumberChecker.AI
Una vez que tu lote de números está formateado a E.164, el siguiente paso es verificar la accesibilidad real. NumberChecker.AI proporciona una API REST para la verificación silenciosa y en tiempo real de la accesibilidad de números de teléfono y plataformas. NumberChecker.AI soporta más de 45 detectores de plataformas, incluyendo iMessage, Viber y Apple.
NumberChecker.AI está diseñado para la verificación masiva por lotes a través de CSV/TXT o API REST. Por ejemplo, el verificador de iMessage acepta un lote mínimo de 2.000 números. De manera crucial, NumberChecker.AI realiza comprobaciones silenciosas sin notificar al propietario de la cuenta.
Aquí tienes un script PHP ejecutable que utiliza cURL para enviar tu lote formateado a la 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";
}
Limitaciones honestas de la validación de teléfonos
Al construir un flujo de trabajo de validación en PHP, es importante entender los límites de las herramientas que estás utilizando.
- Sintaxis vs. Accesibilidad: Las bibliotecas de PHP solo pueden confirmar la sintaxis, no la accesibilidad. Un número puede estar perfectamente formateado según los metadatos de Google, pero seguir estando desconectado o inactivo.
- Requisitos de formato: Las comprobaciones de la API requieren un formato E.164 válido para funcionar correctamente. La entrada sin procesar del usuario siempre debe analizarse localmente primero para evitar desperdiciar solicitudes a la API en cadenas mal formadas.
- Enfoque en el procesamiento por lotes: NumberChecker.AI es una herramienta de procesamiento por lotes, no una herramienta de búsqueda de números individuales. Los flujos de trabajo deben diseñarse para agregar números y enviarlos de forma masiva (por ejemplo, lotes de 1.000 a 2.000 como mínimo, dependiendo del detector de la plataforma) en lugar de realizar solicitudes HTTP individuales para cada registro de usuario.
Preguntas frecuentes (FAQ)
¿Puede PHP verificar de forma nativa si un número de teléfono está activo?
No, los métodos básicos de PHP como preg_match y filter_var solo comprueban la sintaxis y no pueden confirmar si un número es real o está activo. Debes usar una API de terceros para verificar la accesibilidad real.
¿Cuál es la mejor expresión regular (regex) para números de teléfono internacionales en PHP?
Depender únicamente de regex conduce a falsos positivos porque no puede verificar la accesibilidad o el registro en la plataforma, y requiere una actualización constante para los formatos internacionales. En lugar de regex, utiliza la biblioteca giggsey/libphonenumber-for-php para una validación de sintaxis precisa.
¿Cómo formateo números de teléfono a E.164 en PHP?
Puedes formatear números de teléfono al estándar E.164 instalando la biblioteca giggsey/libphonenumber-for-php a través de Composer, analizando la entrada sin procesar mediante PhoneNumberUtil::getInstance()->parse(), y luego formateándola con PhoneNumberFormat::E164.
Comienza con NumberChecker.AI
Prueba NumberChecker.AI gratis: 1.000 comprobaciones al registrarte, sin necesidad de tarjeta de crédito.
¿Listo para empezar?
Prueba nuestro servicio de verificación de números WhatsApp y comprueba la diferencia que aportan los datos limpios.