这个库是 Google 的libphonenumber
的预编译版本,界面稍微简单一些。它具有最小的占用空间 - 是迄今为止 npmjs 上可用的最小的基于 libphonenumber 的库,并且没有依赖项。
与 libphonenumber 不同,它包含一个findNumbers( )
函数来查找文本中的电话号码。
包内提供了 TypeScript 类型。
使用 libphonenumber v8.13.47
v3:
更改了 API(尽管具有向后兼容的 ABI)
添加了 ESM 导出
v4:
parsePhoneNumber
的第二个参数是一个对象
返回值类似于 v3 上的toJSON( )
例如{ regionCode: 'SE' }
而不是区域代码字符串
无构造函数
返回的对象上没有函数
没有抛出错误
更改 API 使其更加简洁
不向后兼容,尽管与 v3 类似,但以下情况除外:
v5:
放弃 Node 12 支持
v6:
删除了 Node 16 支持
v7:
添加了findNumbers( )
功能,用于在文本中查找电话号码
添加了对短号码的支持
由于该库是预编译的,因此它不依赖于闭包编译器,并且不需要在启动时加载它。这使得库速度更快并节省大量空间。这也意味着这个库在任何webpack
项目中使用都很简单(或使用任何其他方式在浏览器中运行)。
在所有使用 Google 的libphonenumber
(或模仿它)的流行电话号码中,只有google-libphonenumber
和libphonenumber-js
这一个具有不错的自述文件和示例。自从第一次进行这些基准测试以来,情况可能已经发生了变化。
库应该快速加载( require()
),快速解析第一次和所有连续时间。它不应该使您的node_modules
膨胀,并且如果可能的话,它应该具有较小的内存占用量。
以下是测试程序的结果,该程序加载库,然后解析电话号码,然后再次解析。每个库被调用 100 次,平均值显示在此处。由于最初编译/优化正则表达式等原因,第一次解析电话号码可能会更慢。第二次解析电话号码将显示该过程中可能的所有未来解析的速度。
行动 | 很棒的电话号码 2.56.0 (库 8.12.29) | google-lib电话号码 3.2.22 (库 8.12.27) | libphonenumber-js 1.9.23 (库-) |
---|---|---|---|
第一次加载库 | 11.0 毫秒 ✅ | 29.67 毫秒 | 32.87 毫秒 |
解析第一个电话号码 | 4.3毫秒 | 4.01 毫秒 | 3.43 毫秒 ✅ |
⇒ 加载+解析第一个数字 | 15.3 毫秒 ✅ | 33.68 毫秒 | 36.3 毫秒 |
解析第二个电话号码 | 0.78 毫秒 ✅ | 0.97 毫秒 | 0.92 毫秒 |
内存使用量增加 | 5.12M ✅ | 9.99米 | 5.86M |
节点模块大小 | 296K ✅ | 600K | 7.6M |
节点模块文件 | 8 | 7 ✅ | 第653章 |
import { parsePhoneNumber } from 'awesome-phonenumber' const pn = parsePhoneNumber( '0707123456', {regionCode: 'SE' } );// 或 e164 格式:const pn = parsePhoneNumber( '+46707123456' );// pn 是现在与:const pn = {valid: true,number: {输入:'0707123456',e164:'+46707123456',国际:'+46 70 712 34 56',国内:'070-712 34 56',rfc3966:'电话:+46-70-712-34-56 ',重要的: '707123456',},可能性:'is-possible',regionCode:'SE',可能:true,shortPossible:false,shortValid:false,canBeInternationallyDialled:true,类型:'mobile',countryCode:46,typeIsMobile:true, typeIsFixedLine: false,};
返回类型是ParsedPhoneNumber
它可以是ParsedPhoneNumberValid
或ParsedPhoneNumberInvalid
。 valid
属性标识解析是否成功,从而返回哪种类型。
解析成功的格式为:
接口 ParsedPhoneNumberValid {valid: true;number: {input: string;international: string;national: string;e164: string;rfc3966: string;significant: string;};possibility: PhoneNumberPossibility; // 字符串联合,见下文regionCode: string;possible: boolean;shortPossible: boolean;shortValid: boolean;canBeInternationallyDialled: boolean;type: PhoneNumberTypes; // 一个字符串联合,见下面countryCode: number;typeIsMobile: boolean;typeIsFixedLine: boolean;}
如果数字解析失败,或者出现其他错误,则返回类型为:
接口 ParsedPhoneNumberInvalid {有效:假;可能:假;可能性:'无效';shortPossible:布尔值;shortValid:布尔值;错误?:未知;};
请注意,不正确(无效)的电话号码仍然可能是给定区域的有效短号码。
从 'awesome-phonenumber' 导入 {parsePhoneNumber,findNumbers,getNumberFrom,getExample,getCountryCodeForRegionCode,getRegionCodeForCountryCode,getSupportedCallingCodes,getSupportedRegionCodes,getAsYouType,}
parsePhoneNumber( phoneNumber, { regionCode: string } )
如上所述解析电话号码。
第一个参数是要解析的电话号码,采用国内或国际(e164,即前缀+
)形式。如果是国家形式,则第二个参数需要包含regionCode
字符串属性,例如“SE”代表瑞典,“CH”代表瑞士等。
要在文本中查找(提取)电话号码,请使用findNumbers( )
:
import { findNumbers } from 'awesome-phonenumber' const text = '我的号码是 +46 707 123 456,否则请拨打 +33777777777。';const Numbers = findNumbers( text );
返回的号码列表的类型为PhoneNumberMatch
例如:
接口PhoneNumberMatch{文本:字符串; // 原始字符串foundphoneNumber: object; // 与parsePhoneNumber()的结果相同start: number; // 文本中的起始偏移量: number; // 文本中的结束偏移}
可以在表单上提供findNumbers( text, options )
的第二个选项参数:
接口 FindNumbersOptions{defaultRegionCode?: string;leniency?: FindNumbersLeniency;maxTries?: number;}
其中FindNumbersLeniency
是'valid'
或'possible'
的枚举。默认值为'valid'
,表示仅找到有效的电话号码。如果设置为'possible'
也可能(但无效)找到电话号码。
可以设置defaultRegionCode
(例如,瑞典为'SE'
),在这种情况下,只要来自该地区,就会找到国家表格上的电话号码(即没有+
前缀)。
对于非常大的文本, maxTries
将设置尝试查找的电话号码的最大数量(不需要实际查找)。
import { parsePhoneNumber, getNumberFrom } from 'awesome-phonenumber' const pn = parsePhoneNumber( '0707654321', {regionCode: 'SE' } );if ( pn.valid ) {const fromJp = getNumberFrom( pn, 'JP' );/ / fromJp 是从日本拨打的号码:fromJp.number === "010 46 70 765 43 21";}
getNumberFrom
的返回值是PhoneNumberFrom
,它可以是PhoneNumberFromValid
或PhoneNumberFromInvalid
。
PhoneNumberFromValid
定义为:
接口 PhoneNumberFromValid{valid: true;number: string;}
PhoneNumberFromInvalid
定义为:
接口 PhoneNumberFromInvalid{有效:假;错误?:未知;}
有时您想要显示某个国家/地区的格式化示例电话号码(也可能是某种类型的电话号码)。 getExample
函数就是用于此目的。
import { getExample } from 'awesome-phonenumber'getExample( 区域代码[, 电话号码类型] ); // 解析后的电话号码
phoneNumberType
是上面定义的任何类型。
import { getExample } from 'awesome-phonenumber'// 获取瑞典电话号码示例 const example = getExample( 'SE' ); // 一个 ParsedPhoneNumberValidconst exampleMobile = getExample( 'SE', 'mobile' ); // 一个 ParsedPhoneNumberValidexample.number.e164; // 例如 '+468123456'exampleMobile.number.e164; // 例如 '+46701234567'exampleMobile.number.national; // 例如'070 123 45 67'
2 个字符的 ISO 3166-1 地区代码(例如,瑞典的“SE”)和相应的国家/地区代码之间存在转换函数。
导入 {getCountryCodeForRegionCode,getRegionCodeForCountryCode,getSupportedCallingCodes,getSupportedRegionCodes,} from 'awesome-phonenumber'getCountryCodeForRegionCode(regionCode); // ->countryCodegetRegionCodeForCountryCode(countryCode); // -> 区域代码
getCountryCodeForRegionCode( 'SE' ); // -> 46getRegionCodeForCountryCode( 46 ); // -> 'SE'
获取支持的呼叫代码(); // -> [调用代码...]
getSupportedRegionCodes(); // -> [ 区域代码... ]
该 API 由PhoneNumber
类组成,该类有时使用枚举。这些都是:
类型 PhoneNumberTypes =| '固定电话'| “固定电话或移动电话”| '移动'| '寻呼机'| '个人号码'| '溢价'| '共享成本'| “免费”| 'uan'| '网络电话'| '未知'
输入电话号码可能性 =| '是可能的'| '无效国家代码'| '太长'| '太短'| '未知'
'国际''国家''e164''rfc3966''重要'
您可以使用getAsYouType()
创建AsYouType
类,以在键入电话号码时对其进行格式化。
import { getAsYouType } from 'awesome-phonenumber' const ayt = getAsYouType( 'SE' );
返回的类实例有以下方法
// 在数字末尾添加一个字符ayt.addChar( nextChar: string );// 获取当前格式化的数字ayt.number( );// 删除最后一个字符ayt.removeChar( );// 将整个数字替换为new number (如果未定义则为空号码)ayt.reset( number?: string );// 获取代表当前号码的 ParsedPhoneNumber 对象ayt.getPhoneNumber( );
除了getPhoneNumber( )
之外,上面的所有函数都以字符串形式返回当前格式化的号码。
import { getAsYouType } from 'awesome-phonenumber' const ayt = getAsYouType( 'SE' );ayt.addChar( '0' ); // -> '0'ayt.addChar( '7' ); // -> '07'ayt.addChar( '0' ); // -> '070'ayt.addChar( '7' ); // -> '070 7'ayt.addChar( '1' ); // -> '070 71'ayt.addChar( '2' ); // -> '070 712'ayt.addChar( '3' ); // -> '070 712 3'ayt.addChar( '4' ); // -> '070 712 34'ayt.addChar( '5' ); // -> '070 712 34 5'ayt.addChar( '6' ); // -> '070 712 34 56'ayt.removeChar( ); // -> '070 712 34 5'ayt.addChar( '7' ); // -> '070 712 34 57'