Regex для универсального номера телефона - PullRequest
1 голос
/ 06 октября 2011

У меня есть регулярное выражение для универсальных телефонных номеров:

**/^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/**

Принимает следующие строки:

339-4248 
(095) 2569835 
+7 (095) 1452389
+1(963)9632587
+12365874
2365789

Но он не принимает

+12589637412
+1 963 9632587
+1701234567

Что с этим случилось? Пожалуйста, помогите мне понять, где я не прав.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Почему вас волнует, где пользователи хотят разбить группы цифр или какие символы они используют для этого? Здесь, в Швеции, часто можно увидеть, как один человек пишет данный номер телефона как 046 123 456 789, а кто-то другой пишет его 046 123 45 67 89, но оба номера набираются одинаково и одинаково действительны. (Как, впрочем, и было бы 04 61 2345 6 78 9 - не тот формат, который я когда-либо видел, но он все равно набирает одинаково.)

Просто удалите нечисловые символы (кроме начальных +, поскольку это имеет смысл), убедитесь, что это разумное количество цифр, сохраните его и отредактируйте в предпочитаемом формате при отображении числа. Или сохраните формат, введенный пользователем, хотя тогда вам нужно принять обычные меры предосторожности для предотвращения SQL-инъекций, CSS, XSRF и т. Д. Атак.

0 голосов
/ 09 мая 2013

Одна вещь, которую вы можете сделать, это исследовать все форматы.Вы нашли несколько хороших.Здесь есть еще: http://en.wikipedia.org/wiki/Local_conventions_for_writing_telephone_numbers

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

Затем вы хотите получить что-то вроде visual-regexp (общий программный пакет, не зависящий от ОС), поместить в него текст и начать создавать регулярные выражения.пока вы не охватите все свои дела.

Делая это только с вашими примерами, я придумал следующее: regexp -nocase -all -line - {+? (? [0-9] )?\? [0-9 -] } совпадение строк

- Пит

0 голосов
/ 06 октября 2011

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

...