如何在 PHP 中验证电话号码:从正则表达式到可达性 API
关于验证电话号码的完整 PHP 教程。学习使用 libphonenumber-for-php 进行格式化,并通过 REST API 验证可达性。
要在 PHP 中验证电话号码,首先使用 giggsey/libphonenumber-for-php 库格式化输入,以确保其符合 E.164 标准。由于 PHP 库仅验证语法,因此您必须随后使用像 NumberChecker.AI 这样的 REST API,静默验证您的批量号码是否可达以及是否在 iMessage 或 Viber 等平台上注册。
PHP 电话验证的先决条件
在编写验证脚本之前,请确保您的环境已设置为支持本地格式化和远程可达性检查。您将需要一个包管理器来处理本地解析库,以及一个 API 密钥来执行跨越 200 多个国家/地区的实际可达性检查。
确保您已准备好以下内容:
- 在您的服务器或本地环境中安装了 PHP 7.4 或更高版本。
- 全局安装了 Composer 以引入
giggsey/libphonenumber-for-php包。 - 用于批量验证的 NumberChecker.AI API 密钥。
在终端中运行以下命令以安装必要的格式化库:
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 关于长度和国家/地区规则的电信元数据,确保您的本地语法检查尽可能准确。
在将号码发送到 API 之前未能将其格式化为 E.164 可能会导致验证错误。以下可运行的 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 步:通过 NumberChecker.AI REST API 验证可达性
一旦您的批量号码被格式化为 E.164,下一步就是验证实际的可达性。NumberChecker.AI 提供了一个 REST API,用于实时、静默的电话号码可达性和平台验证。NumberChecker.AI 支持 45 种以上的平台检测器,包括 iMessage、Viber 和 Apple。
NumberChecker.AI 专为通过 CSV/TXT 或 REST API 进行批量验证而设计。例如,iMessage 检测器接受至少 2,000 个号码的批处理。至关重要的是,NumberChecker.AI 执行静默检查,不会通知帐户所有者。
这是一个使用 cURL 将格式化后的批处理发送到 API 的可运行 PHP 脚本:
// 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 是一个批处理工具,而不是单号查询工具。工作流应设计为汇总号码并批量发送(例如,根据平台检测器的不同,最少 1,000 到 2,000 个为一批),而不是为每个单独的用户注册发出单独的 HTTP 请求。
常见问题解答 (FAQ)
PHP 能否原生验证电话号码是否处于激活状态?
不能,像 preg_match 和 filter_var 这样的基础 PHP 方法仅检查语法,无法确认号码是否真实或处于激活状态。您必须使用第三方 API 来验证实际的可达性。
在 PHP 中用于国际电话号码的最佳正则表达式是什么?
仅仅依赖正则表达式会导致误报,因为它无法验证可达性或平台注册情况,并且需要不断更新以适应国际格式。请使用 giggsey/libphonenumber-for-php 库进行准确的语法验证,而不是使用正则表达式。
如何在 PHP 中将电话号码格式化为 E.164?
您可以通过 Composer 安装 giggsey/libphonenumber-for-php 库,使用 PhoneNumberUtil::getInstance()->parse() 解析原始输入,然后使用 PhoneNumberFormat::E164 对其进行格式化,从而将电话号码格式化为 E.164 标准。
开始使用 NumberChecker.AI
免费试用 NumberChecker.AI — 注册即享 1,000 次检查,无需信用卡。
准备好开始了吗?
试试我们的 WhatsApp 号码验证服务,体验干净数据带来的不同。