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

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 и, самое главное, просто потому, что номер телефона действителен, это не значит, что он существует, и даже если он существует, это не значит, что он принадлежит рассматриваемому человеку ...
Бенджол
О да, я выясню страны, в которых живут наши основные пользователи, а затем напишу код подтверждения. Спасибо всем, я ценю ваши усилия.
Рейнджер
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
@ Чед: Нет. Он сообщает международным пользователям, что им нужно это исключить, и говорит национальным пользователям, что им нужно его использовать. Не во всех странах есть коды городов, начинающиеся с нуля. Такое поведение гарантирует, что когда кто-то видит число, он знает, что делать, когда он находится и когда он находится за пределами страны. В конце концов, не все, кто звонит по стране, должны быть резидентами ...
Марьян Венема
@MarjanVenema, о, я вижу, не понимал, что это нужно национальным пользователям, узнал что-то новое сегодня.
CaffGeek
3

НЕ ограничивайте персонажей; возьми всё, что он тебе даст. Но когда вы набираете его, берите только цифры. Даже тогда это может работать неправильно. Я был в Таиланде за год до того, как узнал, что 123-4567-9 означает не расширение, а диапазон номеров, от 1234567 до 1234569. Когда я набрал «12345679», это сработало, потому что телефонная компания проигнорировала дополнительную цифру. Бери что угодно, набирай только цифры.

Мне нравится, что мой новый телефон разрешает пробелы в номере телефона. Я могу ввести "123 456 7890" просто так, не все пюре вместе.

Энди Кэнфилд
источник
2
+100. Нет ничего хуже, чем компьютер, говорящий «пожалуйста, удалите - из числа», как будто компьютер не имеет ни малейшего понятия, как это сделать самостоятельно. То же самое для номеров кредитных карт, FWIW.
Брайан Оукли
0

Скобки, тире и пробел.

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

Это связано с тем, что IDD (международный прямой набор) делает невозможным обязательное использование каких-либо «специальных символов» при наборе номера, за исключением пауз при наборе цифр.

(Я совсем не разбираюсь в этом; пожалуйста, поправьте меня, если я ошибаюсь.)

rwong
источник
3
Вы забыли знак \ + для международного доступа
Марьян Венема
2
разрешить букву х тоже - по крайней мере, в США обычно расширение префикса с х (например, 555-1212 х123).
Брайан Оукли
0

Единственное, что должно быть проверено, это количество цифр - соответствует ли оно тому, что вам нужно было бы назвать?

Коды доступа могут / не должны быть разрешены для ввода пользователем (например, +1 для США). Я скажу вам, почему - если это американец, который входит в него, и они не настолько умны, они, вероятно, захотят ввести 001 вместо 1. Причина в том, что 00 - это то, как вы получаете доступ к международному номеру из США. Они не знают, в чем разница между этим и просто +1. Если вы звоните на стационарные телефоны между кодами городов (а иногда и в одном и том же коде города), вы также введете 1 перед этим номером. Как в Японии

Возьми Японию. К провинциальным наземным линиям обращаются с 0 на передней части. Но если вы звоните из-за пределов Японии, вам это не нужно 0.

Мобильные номера в Китае состоят из 10 цифр, а в Гонконге - 8. Если в вашей форме указана страна, даже не спрашивайте код страны в начале номера - просто автоматически отобразите его в тексте, доступном только для чтения, рядом с номер, который им нужно ввести.

Список можно продолжить.

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

Любой другой персонаж, кроме цифр, должен быть спорным - у них нет шансов войти в него.

Тодд Майн
источник
1
Я не согласен с тем, чтобы никакие письма не принимались - продолжайте и примите, а затем просто проигнорируйте их. Люди, естественно, пишут расширения с лидирующей «х» (например, 555-1212 х123). Почему бы не позволить это? Люди могут просто разобрать его, и, если компьютеру нужно его использовать, он может легко удалить нецифровые цифры.
Брайан Оукли
0

У Google есть lib для этого:

Общая библиотека Google Java, C ++ и JavaScript для анализа, форматирования и проверки международных телефонных номеров.

https://github.com/googlei18n/libphonenumber

Это делает все возможное, я думаю, что должны быть случаи, которые не обрабатываются, поскольку это отнюдь не простая задача. Позвольте пользователям вводить цифры и буквы, позже удаляйте буквы с кодом.

Кристоф Русси
источник