Я б також запропонував переглянути " libphonenumber " бібліотеку Google. Я знаю, що це не регулярне вираження, але воно робить саме те, що ви хочете.
Наприклад, він визнає, що:
15555555555
- це можливе число, але не дійсне число. Він також підтримує країни за межами США.
Основні функції:
- Розбір / форматування / перевірка номерів телефонів для всіх країн / регіонів світу.
getNumberType
- отримує тип числа на основі самого числа; вміє розрізняти фіксовану лінію, мобільний, безкоштовний, преміум тариф, загальну вартість, VoIP та особисті номери (коли це можливо).
isNumberMatch
- отримує рівень довіри щодо того, чи можуть два числа бути однаковими.
getExampleNumber
/ getExampleNumberByType
- надає дійсні прикладні номери для всіх країн / регіонів з можливістю вказувати, який тип прикладу потрібен номер телефону.
isPossibleNumber
- швидко вгадувати, чи є число можливим телефонним номером, використовуючи лише інформацію про довжину, набагато швидше, ніж повне підтвердження.
isValidNumber
- повна перевірка телефонного номера для регіону з використанням інформації про довжину та префікс.
AsYouTypeFormatter
- формати телефонних номерів на ходу, коли користувачі вводять кожну цифру.
findNumbers
- знаходить числа у введенні тексту.
PhoneNumberOfflineGeocoder
- надає географічну інформацію, пов’язану з номером телефону.
Приклади
Найбільша проблема валідації номера телефону - це дуже культурна залежність.
- Америка
(408) 974–2042
- дійсний номер США
(999) 974–2042
це не є допустимим кількість США
- Австралія
0404 999 999
є дійсним австралійським номером
(02) 9999 9999
також є дійсним австралійським номером
(09) 9999 9999
це не є допустимим австралійський номер
Звичайний вираз є чудовим для перевірки формату телефонного номера, але він дійсно не зможе перевірити дійсність номера телефону.
Я б запропонував пропустити звичайний регулярний вираз, щоб перевірити свій номер телефону та використовувати бібліотеку, таку як Google libphonenumber
(посилання на проект GitHub) .
Представляємо лібфонну кількість!
Використовуючи один із ваших більш складних прикладів, 1-234-567-8901 x1234
ви отримуєте такі дані libphonenumber
(посилання на демонстрацію в Інтернеті) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Тож ви не тільки дізнаєтесь, чи дійсний номер телефону (який він є), але й отримаєте послідовне форматування номера телефону у вашій мові.
Як бонус, libphonenumber
є ряд наборів даних для перевірки дійсності номерів телефонів, тому перевірка такого числа, як +61299999999
(міжнародна версія (02) 9999 9999
), повертається як дійсне число з форматуванням:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber також надає багато додаткових переваг, таких як захоплення місця, за яким телефонний номер визначається як такий, а також отримання інформації про часовий пояс з номера телефону:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Але недійсний австралійський номер телефону ( (09) 9999 9999
) повертає, що це не дійсний номер телефону.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
У версії Google є код Java та Javascript, але люди також реалізували бібліотеки для інших мов, які використовують набір даних про номер телефону i18n Google:
Якщо ви не впевнені, що ви завжди будете приймати номери з однієї мови, і вони завжди будуть в одному форматі, я настійно пропоную не писати для цього власний код і використовувати libphonebumber для перевірки та відображення телефонних номерів.