用于解析、格式化、存储和验证国际电话号码的 PHP 库。该库基于 Google 的 libphonenumber。
目前支持 PHP 7.4 至 PHP 8.4 版本。
需要 PECL mbstring 扩展。
推荐使用composer来安装该库。
composer require giggsey/libphonenumber-for-php
您还可以使用任何其他符合 PSR-4 标准的自动加载器。
如果您不使用 Composer,请确保还加载该项目具有的任何依赖项,例如 giggsey/locale。
如果您只想使用核心 PhoneNumber Util 功能,则可以使用 giggsey/libphonenumber-for-php-lite,它提供的包大小要小得多。
提供了在线演示,源代码可以在 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 libphonenumberPhoneNumber#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 = libphonenumbergeocoding 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 = 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 演示不同,请在此处提出问题。
通常不需要生成数据,因为该存储库通常始终具有最新的数据元数据。
如果您确实需要生成数据,命令由 Phing 提供。确保安装了所有 dev Composer 依赖项,然后运行
vendor/bin/phing compile
此编译过程以 METADATA-VERSION.txt 中指定的版本克隆 libphonenumber 项目。
该项目使用 PHPUnit Bridge 来维护支持的 PHP 版本的兼容性。
要在本地运行测试,请运行./phpunit
脚本。
存在其他将 libphonenumber-for-php 集成到框架中的包。
框架 | 套餐 |
---|---|
交响乐团 | 电话号码捆绑 |
拉维尔 | Laravel 电话 |
伊伊2 | 电话输入 |
小花 | 电话号码 |
打字3 | TYPO3 电话分机 |
这些包由第三方提供,其质量无法得到保证。