Які спеціальні символи повинні дозволяти номер телефону?


20

Тож я розробляю веб-сторінку, яка буде використовуватись для глобальних користувачів, включає користувачів з Канади, США, Індії, Великобританії і т. Д. Мені потрібно застосувати перевірки цього поля номера телефону, але я не впевнений, що найкращий спосіб зробити це .

Деякі з дійсних форматів, які я можу придумати:

  1. 1800123456 (Індія)
  2. використання "-" номерів телефонів у США

Я трохи розгублений щодо того, які спеціальні символи я повинен дозволити користувачеві вводити (напр. - / ()). Як інші вирішували це в минулому?


1
Що з номерами телефонів, вираженими літерами, наприклад, 0800DIALTHIS?
mouviciel

3
Що ви намагаєтеся запобігти? Користувач бреше? Користувач не хоче, щоб ви знали їх кількість? Користувач занадто лінивий щось вводити? Користувач робить помилку?
Бенджол

@ mouviviel: так, також мені потрібно подумати про те, що я беру один сценарій валідації за один раз, тому я буду думати про це.
Рейнджер

@Benjol: Ця програма є комерційною, тому ми не можемо ризикувати на наших кустомерах, я знаю, що користувач введе правильне число, але що робити, якщо він / вона цього не робить. Оцінка є досить важливою, оскільки вони заощаджують не лише друкарські помилки. Я не хочу, щоб мій БД заповнювався марними барахлами.
Рейнджер

5
ну що ви робите для перевірки їх електронних адрес? Ви помітите, що майже всі веб-сайти виконують перевірку "реального життя" (тобто надсилають вам пошту). Я думаю , що якщо номер телефону , що важливо, ви повинні були б зробити що - то еквівалент.
Бенжол

Відповіді:


21

Тільки тому, що ви можете щось обмежити (саме за це вам платять, як програміст, писати код), це не означає, що ви дійсно повинні це робити.

Який сенс перевірити число? Чому це корисно? Чи вийде з ладу, якщо користувач введе "0800DIALTHIS", або "私 は 電話 番号 を 持 っ て い い" або "(499) 123-45-67 добавочный 4425"? Це, безумовно, буде (ви говорите "глобально". Чи не так?), Тоді як користувачі просто хотіли передати вам важливу інформацію про те, як зв’язатися з ними по телефону.

Крім того, спосіб зберігання даних повинен регулюватися способом їх використання. Як ви будете використовувати цифри? Чи будуть вони використовуватися для автоматичного надсилання спаму SMS - або вони будуть набиратися вручну менеджерами? Якщо це останнє, то допустити будь-які додаткові символи добре, оскільки людський мозок зможе розібрати їх так, як вони бачать найбільш підходящим; і в цьому випадку вам дійсно не потрібні валідації, які просто будуть дратувати людей.


7
+1 для "користувачі просто хотіли передати вам важливу інформацію". Я занадто часто бачив зайву перевірку, яка просто дратує користувача без будь-яких фактичних технічних (або організаторських) вимог.
пердіан

6
+1 - перевірка номера телефону (особливо це широко визначено) часто є безглуздим, не захищеним від майбутнього (наприклад, KL5-6743 раніше був дійсним номером телефону), а просто дратує користувачів, які мають особливі випадки. Зробіть вам телефонні номери великим текстовим полем і дозвольте автоматизованим набором номерів (якщо такі є у цьому сценарії) проаналізувати, що вони можуть. Винятки можуть бути сприйняті людьми, які вміють впоратись із ситуацією належним чином.
EZ Hart

8
+1, і найголовніше лише тому, що номер телефону дійсний, це не означає, що він існує, і навіть якщо він існує, це не означає, що він належить особі, про яку йдеться ...
Benjol

О так, я визначу країни, де живуть наші основні користувачі, і тоді я напишу код підтвердження. Дякую всім, я вдячний вашим зусиллям.
Рейнджер

4
@Ranger Це абсолютно протилежне тому, на що отримували відповідь.
Себастьян Редл

7

Було б дуже важко дізнатися, чи є число дійсним чи ні, оскільки різні країни мають різний формат. Наприклад, у Франції 06 12 34 56 78 є дійсним номером телефону, тоді як 00 12 34 56 78 - ні, оскільки номер може починатись лише з 01 по 09, 06 та 07 з мобільних телефонів.

Також телефонні номери можна записати в декількох форматах навіть в одній країні. Я бачив:

  • 06 12 34 56 78
  • 0612345678
  • 06.12.34.56.78
  • 06-12-34-56-78
  • +33612345678
  • +33 (0) 6 12 34 56 78

останні два - міжнародна форма.

В загальному:

  1. Дозволити дужки, +символ лише як провідний символ, тире, крапки, коми та пробіли.
  2. Якщо можливо, пам’ятайте лише про нормалізовану форму (тобто +33 (0) 612345678).
  3. Якщо це неможливо, принаймні видаліть розділові символи (як пробіли).

Не надто глибоко проходити валідацію для країн не рекомендується. Існує не лише велика кількість правил, але і правила змінюються. Наприклад, у Франції кілька років тому не було номерів телефонів, починаючи з 07 або 09. Зі збільшенням кількості мобільних телефонів з'явилося 07. З послугами VoIP з'явилося 09.

Ви також можете враховувати спеціальні номери. Наприклад, 3635 - це дійсне число у Франції, навіть якщо воно містить лише чотири цифри і починається з нуля.


1
Це допоможе показати використання дужок у ваших прикладах. Міжнародні номери часто використовують їх для введення основного нуля коду міста, щоб вказати, що ви не набираєте його під час дзвінка з-за кордону. Наприклад, +31 (0)30 1234567де 31 - Нідерланди, 030 - код міста, а 1234567 - абонент.
Мар'ян Венема

2
Не забудьте необов’язкове поле для коду розширення (у якому може знадобитися ключ фунта чи зірочка).
rwong

@MarjanVenema, я не роблю багато міжнародного набору, але це стандартне додавання нуля та додавання дужок (0), щоб сказати, що НЕ набирати його? Не було б простіше просто взагалі залишити 0?
CaffGeek

@Chad: Ні. Він повідомляє міжнародним користувачам, що вони потребують цього залишати, та національним користувачам, що вони повинні ним користуватися. Не у всіх країнах є коди регіону, що починаються з нуля. Це робиться таким чином, коли хтось бачить номер, вони знають, що робити, коли вони перебувають і коли вони перебувають за межами країни. Не всі, хто називає національність, повинні бути мешканцями все-таки ...
Мар'ян Венема

@MarjanVenema, о, я бачу, не зрозумів, що потрібні національні користувачі, сьогодні дізнався щось нове.
CaffGeek

3

НЕ обмежуйте символів; візьми все, що він тобі дає. Але коли ви наберете це, візьміть лише цифри. Навіть тоді це може працювати неправильно. Я був у Таїланді за рік до того, як дізнався, що 123-4567-9 означає не розширення, а діапазон номерів, 1234567 - 1234569. Коли я набрав "12345679", це спрацювало, тому що телефонна компанія ігнорувала зайву цифру. Візьміть що завгодно, наберіть лише цифри.

Мені подобається, що мій новий телефон дозволяє пробілки в номері телефону. Я можу ввести "123 456 7890" просто так, не всі пюре разом.


2
+100. Немає нічого гіршого, ніж на комп’ютері, що говорить "будь ласка, видаліть - з числа", як ніби комп'ютер не має поняття, як це зробити самостійно. Те саме для номерів кредитних карток, FWIW.
Брайан Оуклі

0

Дужки, тире та пробіл.

Після введення користувачем номера телефону, що містить ці символи, ви можете перевірити їх відповідно до правил, що відповідають конкретній країні (для цього потрібно зібрати ці правила для кожної країни), а потім нецифрові цифри можуть бути фактично відхилені, коли вони обробляється всередині вашого програмного забезпечення.

Це пояснюється тим, що IDD (міжнародний прямий набір) унеможливлює необхідність використання будь-яких "спеціальних символів" для набору номера, за винятком пауз при штампуванні цифр.

(Я взагалі не обізнаний у цьому; будь ласка, виправте мене, якщо я помиляюся.)


3
Ви забуваєте знак \ + для міжнародного доступу
Мар'ян Венема

2
дозволити також букву x - принаймні в США прийнято префікс розширення з x (наприклад: 555-1212 x123).
Брайан Оуклі

0

Єдине, що має бути підтверджено - це кількість цифр - чи відповідає вона тому, що вам потрібно було б зателефонувати?

Користувачам не можна дозволяти вводити коди доступу (тобто +1 для США). Я скажу вам, чому - якщо це американський вхід, і вони не все такі кмітливі, вони, ймовірно, захочуть ввести 001 замість 1. Причиною цього є те, що 00 - це те, як ви отримуєте доступ до міжнародного номера з США. Вони не знають, в чому різниця між цим і просто +1. Якщо ви телефонуєте на стаціонарні телефонні лінії між кодами регіонів (а іноді і в одному і тому ж коді), ви також введете номер 1 перед цим номером. Так само, як Японія.

Візьміть Японію. До провінційних земельних ліній можна звернутись із 0 на передній частині. Але якщо ви телефонуєте за межами Японії, вам це не потрібно 0.

Мобільні номери в Китаї мають 10 цифр, а в Гонконзі - 8. Якщо ваша форма захоплює країну, тоді навіть не запитуйте код країни на початку номера - просто покажіть його автоматично в тексті, який читається прямо поруч із номер, який їм потрібно ввести.

Список продовжується.

Просто підтвердьте кількість цифр (переконайтеся, що жодні літери не приймаються) та полегшите кінцевому користувачеві ввести потрібну кількість цифр. Тобто вони не повинні вводити код країни, і якщо ваша форма дуже розумна, можливо, їм навіть не потрібно буде вводити код міста, якщо це стаціонарний номер. Або якщо вони почнуть вводити такі речі, як код доступу, наприклад 0 перед японським номером, просто дайте їм знати, що цього не потрібно.

Кожен інший персонаж, окрім цифр, повинен бути точкою суперечки - у них немає шансу ввести їх.


1
Я не згоден переконатися, що жодні листи не приймаються - ідіть і приймайте, а потім просто ігноруйте їх. Люди, природно, записують розширення з провідним "x" (наприклад: 555-1212 x123). Чому б не дозволити цього? Люди можуть його добре розібрати, і якщо комп'ютер повинен ним користуватися, він може тривіально викреслити нецифрові цифри.
Брайан Оуклі

0

Google має ліб для цього:

Загальна бібліотека Java, C ++ та JavaScript Google для розбору, форматування та перевірки міжнародних телефонних номерів.

https://github.com/googlei18n/libphonenumber

Це докладає найкращих зусиль, я думаю, що повинні бути випадки, які не розглядаються, оскільки це аж ніяк не легке завдання. Нехай користувачі вводять цифри та літери, видаляють літери пізніше з кодом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.