适用于 PHP 的 libphonenumber
它是什么?
用于解析、格式化、存储和验证国际电话号码的PHP库。此库基于 Google 的 libphonenumber 。
安装
目前支持 PHP 5.3 到 PHP 7.4 版本。
PECL mbstring 扩展是必需的。
建议使用 Composer 来安装这个库。
$ composer require giggsey/libphonenumber-for-php
你也可以使用任何其他兼容 PSR-4 的 autoloader。
如果您不使用 composer,请确保你也加载了这个项目的任何依赖关系,比如 giggsey/locale 。
文档
在线演示
有一个在线演示,其源代码可以 giggsey/libphonenumber-example 上找到。
功能亮点
- 解析/格式化/验证全球所有国家/地区的电话号码。
- getNumberType -- 根据数字本身获取数字的类型;能够区分固定线路, 移动, 免费, 保费率, 共享成本, VoIP 和个人号码 (在可行的情况下)。
- isNumberMatch -- 获取两个数字是否相同的置信度。 getExampleNumber/getExampleNumberByType -- 为所有国家/地区提供有效的示例数字,并可选择指定需要哪种类型的示例电话号码。
- isValidNumber -- 使用长度和前缀信息完整验证某个地区的电话号码。
- PhoneNumberOfflineGeocoder -- 提供与电话号码相关的地理信息。
- PhoneNumberToTimeZonesMapper -- 提供与电话号码相关的时区信息。
- PhoneNumberToCarrierMapper -- 提供与电话号码相关的运营商信息。
版本
这个库会尝试使用与 Google 相同的版本号。可能需要额外的版本来解决不能等到Google 下一个版本发布的关键问题。
这确实意味着这个项目可能不遵循语义版本,而是 Google 的版本策略。因此,主要版本的跳转实际上可能不包含任何向后不兼容的更改。 请阅读此类版本的发行说明。
Google尝试根据语义版本发布他们的版本,正如他们的版本控制指南。
快速示例
假设你有一个代表瑞士电话号码的字符串。这是你解析/标准化为 PhoneNumber 对象的方式:
$swissNumberStr = "044 668 18 00"; $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); try { $swissNumberProto = $phoneUtil->parse($swissNumberStr, "CH"); var_dump($swissNumberProto); } catch (\libphonenumber\NumberParseException $e) { var_dump($e); }
此时,swissNumberProto 包含:
class libphonenumber\PhoneNumber#9 (7) { private $countryCode => int(41) private $nationalNumber => double(446681800) private $extension => NULL private $italianLeadingZero => NULL private $rawInput => NULL private $countryCodeSource => NULL private $preferredDomesticCarrierCode => NULL }
现在让我们验证一下数字是否有效:
$isValid = $phoneUtil->isValidNumber($swissNumberProto); var_dump($isValid); //true
格式化方法支持一些格式,如下所示:
//Produces "+41446681800" echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::E164); //Produces "044 668 18 00" echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::NATIONAL); //Produces "+41 44 668 18 00" echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::INTERNATIONAL);
您也可以选择以另一个国家/地区拨打电话的方式格式化电话号码。
//Produces "011 41 44 668 1800", the number when it is dialled in the United States. echo $phoneUtil->formatOutOfCountryCallingNumber($swissNumberProto, "US"); //Produces "00 41 44 668 18 00", the number when it is dialled in Great Britain. echo $phoneUtil->formatOutOfCountryCallingNumber($swissNumberProto, "GB");
地理编码
$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); $swissNumberProto = $phoneUtil->parse("044 668 18 00", "CH"); $usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US"); $gbNumberProto = $phoneUtil->parse("0161 496 0000", "GB"); $geocoder = \libphonenumber\geocoding\PhoneNumberOfflineGeocoder::getInstance(); //Outputs "Zurich" echo $geocoder->getDescriptionForNumber($swissNumberProto, "en_US"); //Outputs "Zürich" echo $geocoder->getDescriptionForNumber($swissNumberProto, "de_DE"); //Outputs "Zurigo" echo $geocoder->getDescriptionForNumber($swissNumberProto, "it_IT"); //Outputs "Mountain View, CA" echo $geocoder->getDescriptionForNumber($usNumberProto, "en_US"); //Outputs "Mountain View, CA" echo $geocoder->getDescriptionForNumber($usNumberProto, "de_DE"); //Outputs "미국" (Korean for United States) echo $geocoder->getDescriptionForNumber($usNumberProto, "ko-KR"); //Outputs "Manchester" echo $geocoder->getDescriptionForNumber($gbNumberProto, "en_GB"); //Outputs "영국" (Korean for United Kingdom) echo $geocoder->getDescriptionForNumber($gbNumberProto, "ko-KR");
ShortNumberInfo
$shortNumberInfo = \libphonenumber\ShortNumberInfo::getInstance(); //true var_dump($shortNumberInfo->isEmergencyNumber("999", "GB")); //true var_dump($shortNumberInfo->connectsToEmergencyNumber("999", "GB")); //false var_dump($shortNumberInfo->connectsToEmergencyNumber("911", "GB")); //true var_dump($shortNumberInfo->isEmergencyNumber("911", "US")); //true var_dump($shortNumberInfo->connectsToEmergencyNumber("911", "US")); //false var_dump($shortNumberInfo->isEmergencyNumber("911123", "US")); //true var_dump($shortNumberInfo->connectsToEmergencyNumber("911123", "US"));
将电话号码映射到运营商
$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); $swissNumberProto = $phoneUtil->parse("798765432", "CH"); $carrierMapper = \libphonenumber\PhoneNumberToCarrierMapper::getInstance(); //Outputs "Swisscom" echo $carrierMapper->getNameForNumber($swissNumberProto, "en");
将电话号码映射到时区
$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); $swissNumberProto = $phoneUtil->parse("798765432", "CH"); $timeZoneMapper = \libphonenumber\PhoneNumberToTimeZonesMapper::getInstance(); //returns array("Europe/Zurich") $timeZones = $timeZoneMapper->getTimeZonesForNumber($swissNumberProto);
常见问题
遇到无效号码的问题?
这个库使用了 Google libphonenumber 中的电话号码元数据。如果该库按预期工作,它应该提供与 Google 项目的 Java 版本相同的结果。
首先通过他们的在线演示
如果你认为一个电话号码返回了一个不正确的结果,请先通过它们的 在线演示 用libphonenumber 进行测试。如果它返回的结果和这个项目一样,而你又觉得它有错误,那么就把它作为 libphonenumber 项目的一个问题提出来。
如果 Google 的 在线演示 给出了与 libphonenumber-for-php demo 演示不同的结果,那么请在这里提出一个问题。
生成数据
通常不需要生成数据,因为此存储库通常始终具有高达数据元数据。
如果您确实需要生成数据,则命令由 Phing 提供。确保安装了所有dev composer依赖项,然后运行
$ vendor/bin/phing compile
这个编译过程以 METADATA-VERSION.txt 中指定的版本克隆 libphonenumber 。
与框架集成
还有其他一些将 libphonenumber-for-php 整合到框架中的软件包。
框架 | 软件包 |
---|---|
Symfony | PhoneNumberBundle |
Laravel | Laravel Phone |
Yii2 | PhoneInput |
Kohana | PhoneNumber |
TYPO3 | TYPO3 Phone Extension |
这些软件包由第三方提供,其质量无法保证。
(Second edition: vz revised at 2020.08.30)