parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Класс для работы с телефонными номерами

mryasov 29.06 20:00

Parser3 Phone Number

Сделал отдельный Parser-класс для разбора, нормализации, форматирования и валидации телефонных номеров разных стран.

Git: mryasov-als/parser3-phone-number

Что умеет

- принимает любую строку с номером: пробелы, скобки, дефисы, плюс;
- нормализует номер в E.164;
- возвращает страну, country calling code, национальную часть, international/national формат;
- определяет тип номера: MOBILE, FIXED_LINE, TOLL_FREE и т.п.;
- умеет работать без defaultCountry, если страна определяется однозначно;
- если номер подходит нескольким странам, возвращает валидный результат с предупреждением ambiguous_country;
- runtime полностью на Parser3: без JS, Node.js, HTTP API и shell-команд при разборе.

Пример использования
@USE
PhoneNumber.p

$phone[^PhoneNumber:parse[9990000000][
	$.defaultCountry[ru]
]]
Можно создать экземпляр с настройками по умолчанию:
$PhoneParser[^PhoneNumber::create[
	$.defaultCountry[ru]
]]
$phone[^PhoneParser.parse[9990000000]]
Пример результата
$phone[
	$.ok(true)
	$.valid(true)
	$.possible(true)
	$.ambiguous(false)
	$.warning[]
	$.country[ru]
	$.countryCallingCode[7]
	$.e164[+79990000000]
	$.digits[79990000000]
	$.nationalDigits[9990000000]
	$.international[+7 999 000 00-00]
	$.national[8 (999) 000-00-00]
	$.type[MOBILE]
	$.error[]
	$.candidates[^table::create{country
	}]
]
Неоднозначный пример без defaultCountry
$phone[^PhoneNumber:parse[8 800 555-55-50]]
Такой номер валиден, но без страны неоднозначен:
$phone[
	$.ok(true)
	$.valid(true)
	$.possible(true)
	$.ambiguous(true)
	$.warning[ambiguous_country]
	$.country[]
	$.countryCallingCode[375]
	$.e164[+3758005555550]
	$.digits[3758005555550]
	$.nationalDigits[8005555550]
	$.international[+375 800 555 5550]
	$.national[8 800 555 5550]
	$.type[TOLL_FREE]
	$.error[]
	$.candidates[^table::create{country
by
de
id
kz
lu
ru}]
]
Если нужен именно российский вариант, нужно передать defaultCountry[ru].

Данные

Справочник генерируется из metadata libphonenumber-js / Google libphonenumber и сохраняется сразу в Parser3-файл PhoneNumberMetadata.p. В runtime ничего внешнего не вызывается.

В репозитории есть тесты и fixture-примеры по странам.

  • Класс для работы с телефонными номерами, mryasov 29.06 20:00