Эта библиотека представляет собой предварительно скомпилированную версию libphonenumber
от Google с немного более простым интерфейсом. Она занимает минимум места — на сегодняшний день это самая маленькая библиотека на основе номера libphonenumber, доступная в npmjs, и она не имеет зависимостей.
В отличие от libphonenumber, он включает функцию findNumbers( )
для поиска телефонных номеров в тексте.
Типизация TypeScript предоставляется в пакете.
Использует libphonenumber v8.13.47.
версия 3:
Измененный API (хотя и с обратно совместимым ABI)
Добавлен экспорт ESM.
версия 4:
Вторым аргументом parsePhoneNumber
является объект.
Возвращаемое значение похоже на toJSON( )
в версии 3.
Например, { regionCode: 'SE' }
вместо строки кода региона.
Нет конструктора
Нет функций для возвращаемого объекта
Никаких ошибок не выскакивает
Изменен API, стал намного чище.
Не имеет обратной совместимости, как и v3, за исключением:
v5:
Прекращена поддержка узла 12.
v6:
Прекращена поддержка узла 16.
v7:
Добавлена функция findNumbers( )
для поиска телефонных номеров в тексте.
Добавлена поддержка коротких номеров.
Поскольку эта библиотека предварительно скомпилирована, она не зависит от компилятора замыкания и не требует ее загрузки при запуске. Это ускоряет работу библиотеки и экономит много места. Это также означает, что эту библиотеку легко использовать в любом проекте webpack
(или использовать любые другие средства для запуска в браузере).
Среди всех популярных телефонных номеров, использующих libphonenumber
Google (или имитирующих его), только этот, google-libphonenumber
и libphonenumber-js
имеет достойные README с примерами. Возможно, ситуация изменилась с тех пор, как мы впервые провели эти тесты .
Библиотека должна быстро загружаться ( require()
), быстро анализироваться с первого раза и все последующие разы. Он не должен раздувать ваши node_modules
и, если возможно, должен занимать небольшой объем памяти.
Ниже приведен результат тестовой программы, которая загружает библиотеку, затем анализирует номер телефона, а затем еще раз. Он вызывается 100 раз для каждой библиотеки, и здесь показаны средние значения. Анализ номера телефона в первый раз может быть медленнее из-за первоначальной компиляции/оптимизации регулярных выражений и тому подобного. Анализ телефонного номера во второй раз покажет скорость, вероятно, всего будущего анализа в этом процессе.
Действие | потрясающий номер телефона 2.56.0 (библиотека 8.12.29) | google-libphonenumber 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,12 М ✅ | 9,99 М | 5,86 М |
размер node_modules | 296 тыс. ✅ | 600 К | 7,6 М |
файлы node_modules | 8 | 7 ✅ | 653 |
import { parsePhoneNumber } from 'awesome-phonenumber'const pn = parsePhoneNumber( '0707123456', { RegionCode: 'SE' } ); // или в формате e164: const pn = parsePhoneNumber( '+46707123456' );// pn is теперь то же самое, что:const pn = {valid: true,number: {input: '0707123456',e164: '+46707123456',международный: '+46 70 712 34 56', национальный: '070-712 34 56',rfc3966: 'тел:+46-70-712 -34-56',значительно: '707123456',},возможность: 'is-possible',regionCode: 'SE',possible: true,shortPossible: false,shortValid: false,canBeInternationallyDialled: true,type: 'mobile',countryCode: 46,typeIsMobile: true, типIsFixedLine: ложь,};
Тип возвращаемого значения — ParsedPhoneNumber
, который может быть либо ParsedPhoneNumberValid
, либо ParsedPhoneNumberInvalid
. Свойство valid
определяет, был ли синтаксический анализ успешным или нет, и, следовательно, какой тип возвращается.
Формат успешного анализа:
интерфейс ParsedPhoneNumberValid {действительный: true; число: {вход: строка; международный: строка; национальный: строка; e164: строка; rfc3966: строка; значимое: строка;}; возможность: PhoneNumberPossibility; // объединение строк, см. нижеregionCode: string;possible: boolean;shortPossible: boolean;shortValid: boolean;canBeInternationallyDialled: boolean;type: PhoneNumberTypes; // объединение строк, см. нижеcountryCode: number;typeIsMobile: boolean;typeIsFixedLine: boolean;}
Если число не удалось проанализировать или произошла другая ошибка, тип возвращаемого значения:
интерфейс ParsedPhoneNumberInvalid {действительно: ложь;возможно: ложь;возможность: 'недействительно';shortPossible: логическое значение;shortValid: логическое значение;ошибка?: неизвестно;};
Обратите внимание, что неверный (недействительный) номер телефона все равно может быть действительным коротким номером для данного региона.
импортировать {parsePhoneNumber,findNumbers,getNumberFrom,getExample,getCountryCodeForRegionCode,getRegionCodeForCountryCode,getSupportedCallingCodes,getSupportedRegionCodes,getAsYouType,} из 'awesome-phonenumber'
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; // Начальное смещение в тексте: число; // Смещение конца в тексте}
Второй аргумент параметров для findNumbers( text, options )
можно указать в форме:
интерфейс FindNumbersOptions {defaultRegionCode?: строка; снисходительность?: FindNumbersLeniency; maxTries?: число;}
где 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 {действительный: правда; номер: строка;}
PhoneNumberFromInvalid
определяется как:
интерфейс PhoneNumberFromInvalid {действительно: ложь; ошибка?: неизвестно;}
Иногда вам нужно отобразить отформатированный пример телефонного номера для определенной страны (а может быть, и для определенного типа телефонного номера). Для этого используется функция getExample
.
import { getExample } from 'awesome-phonenumber'getExample(regionCode[, phoneNumberType]); // Разобранный номер телефона
phoneNumberType
— это любой из типов, определенных выше.
import { getExample } from 'awesome-phonenumber'// Получить пример шведского номера телефонаconst example = getExample( 'SE' ); // ParsedPhoneNumberValidconst exampleMobile = getExample( 'SE', 'mobile'); // Анализируемый номер телефонаValidexample.number.e164; // например, '+468123456'exampleMobile.number.e164; // например, '+46701234567'exampleMobile.number.national; // например, '070 123 45 67'
Существуют функции преобразования между двухзначными кодами регионов ISO 3166-1 (например, «SE» для Швеции) и соответствующими кодами стран.
импортировать {getCountryCodeForRegionCode, getRegionCodeForCountryCode, getSupportedCallingCodes, getSupportedRegionCodes,} из 'awesome-phonenumber'getCountryCodeForRegionCode (regionCode); // -> CountryCodegetRegionCodeForCountryCode(countryCode); // -> Код региона
getCountryCodeForRegionCode('SE'); // -> 46getRegionCodeForCountryCode( 46 ); // -> 'ЮВ'
getSupportedCallingCodes(); // -> [коды вызова... ]
getSupportedRegionCodes(); // -> [коды регионов... ]
API состоит из класса PhoneNumber
, который иногда использует перечисления . Это:
введите PhoneNumberTypes =| 'фиксированная связь'| 'фиксированная или мобильная связь'| 'мобильный'| 'пейджер'| 'личный номер'| 'премиум-тариф'| «совместная стоимость» | «бесплатный» | 'уань'| 'voip'| 'неизвестный'
введите PhoneNumberPossibility =| 'возможно'| 'неверный код страны'| 'слишком длинный'| «слишком короткий» | 'неизвестный'
''международный''национальный''e164''rfc3966''значительный'
Вы можете создать класс AsYouType
с помощью getAsYouType()
для форматирования номера телефона по мере его ввода.
import { getAsYouType } from 'awesome-phonenumber'const ayt = getAsYouType('SE');
Возвращенный экземпляр класса имеет следующие методы
// Добавляем символ в конец числаayt.addChar( nextChar: string ); // Получаем текущий форматированный номер numberayt.number(); // Удаляем последний символayt.removeChar(); // Заменяем целое число на новый номер (или пустой номер, если он не определен)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'