LINUX.ORG.RU

делюсь регуляркой для телефонных номеров


0

0

/(?:^[+]?[87][- ]?[0-9][0-9][0-9][- ]?[0-9][0-9][0-9][- ]?[0-9][0-9][- ]?[0-9][0-9]$)|(?:(?:^([+]?[87][- ]?[\(]?[0-9][0-9][0-9][- ]?[0-9]?[\)]?[- ]?)?[0-9]?[0-9][- ]?[0-9][0-9][- ]?[0-9][0-9]$)|(?:^([+]?[87][- ]?[\(]?[0-9][0-9][0-9][- ]?[0-9]?[\)]?[- ]?)?[0-9]?[0-9][0-9][- ]?[0-9][0-9][0-9]$))/

pcre совместимая, матчит мобилные и стационарные 5-6и знаки (с кодом города вида xxx xxx-x xxxx и без). Только для матча (т.е. правильного выдергивания данных в ней нет ибо для простой валидации). Опыта маловато, понадобилось вот, но не нагуглилось ничего.

★★★★★
Ответ на: комментарий от jtootf

чтобы засунуть в метод валидатора работающего на регекспах

Syncro ★★★★★
() автор топика

>[0-9][0-9][0-9]

Зачем языки, которые не умеют \d{3}
?

>[+]?[87]

Т.е. на +3813934380 позвонить нельзя?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

ага, уже переписал на вот так:

/(?:^(?:8)|(?+7)[- ]?\d{3}[- ]?\d{3}[- ]?\d{2}[- ]?\d{2}$)|(?:(?:^((?:8)|(?+7)[- ]?[\(]?\d{3}[- ]?[0-9]?[\)]?[- ]?)?\d?\d[- ]?\d{2}[- ]?d{2}$)|(?:^((?:8)|(?+7)[- ]?[\(]?\d{3}[- ]?\d?[\)]?[- ]?)?\d?\d{2}[- ]?\d{3}$))/

> Т.е. на +3813934380 позвонить нельзя?

надо было только РФ и то не всю

Syncro ★★★★★
() автор топика
Ответ на: комментарий от tzukko

а это и есть несколько регекспов упакованных в один:

мобилный | (стационар 1 | стационар2)

сначала делал короче, но тогда проходило лишнее

Syncro ★★★★★
() автор топика

Биллинг для платёжной системы пишешь? Оставь затею, регэкспы для этого медленно работают.

mv ★★★★★
()

Че-то как-то монструозно. Есть ощущение, что можно было как-то проще, тем более только для матчинга....

cathode
()
Ответ на: комментарий от cathode

окончательный вариант такой:


/(?:^(?:8)|(?:[+]7)[- ]?\d{3}[- ]?\d{3}[- ]?\d{2}[- ]?\d{2}$)|(?:(?:^((?:8)|(?:[+]7)[- ]?[\(]?\d{3}[- ]?\d?[\)]?[- ]?)?\d{1,2}[- ]?\d{2}[- ]?\d{2}$)|(?:^((?:8)|(?:[+]7)[- ]?[\(]?\d{3}[- ]?\d?[\)]?[- ]?)?\d{2,3}[- ]?\d{3}$))/


на наборе


8-923-610-16-16
8 922 610-16-16
+7 921 610-16-16
10-16-16
101616
362-521
5-16-16
51616
51 616
5 16 16
8 (2222) 10 16 16
8 (222-2) 10 16 16
8 (222) 10 16 16
+7 (222-2) 362 521


если кто знает вариант покороче, буду признателен:)

Syncro ★★★★★
() автор топика
Ответ на: комментарий от Syncro

Если номера телефонов вводятся пользователем, то ИМХО проще всего в программе/на_сайте сделать формочку, в которую номер телефона можно ввести только в строго определённом формате.

Deleted
()
Ответ на: комментарий от Deleted

даже если разрешить вводить только цифры, вариант с простыми проверками будет выглядеть объемнее и кривее

Syncro ★★★★★
() автор топика
Ответ на: комментарий от Syncro

Если хочется в 1 действие, то хз.
В несколько действий можно попробовать менее монструозно.

tzukko
()
Ответ на: комментарий от Syncro

> не, производительность не критична, просто не хочется лепить многоэтажные ифы

Лучше уж многоэтажный, но понятный if, чам это. Тот, кому достанется поддержка твоего кода, тебя возненавидит. :-)

smh ★★★
()
Ответ на: комментарий от smh

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

з.ы. сгруппировал стационарные, получилось чуть покороче:

/(?:^(?:8)|(?:[+]7)[- ]?\d{3}[- ]?\d{3}[- ]?\d{2}[- ]?\d{2}$)|(?:(?:^((?:8)|(?:[+]7)[- ]?[\(]?\d{3}[- ]?\d?[\)]?[- ]?)?(?:\d{1,2}[- ]?\d{2}[- ]?\d{2}$)|(?:\d{2,3}[- ]?\d{3}$)))/

Syncro ★★★★★
() автор топика
Ответ на: комментарий от Syncro

Ну вот навскидку на перле.
Идея в том, чтобы удалить код и привести к виду последовательности цифр:
# удаляем '-'
s/-/ /g;
# меняем +7 в начале на 8
s/^\+\d{1}/8/g;
# удаляем индекс со скобками
s/^8\s*\(.*?\)\s*//;
# удаляем индекс без скобок
s/^8\s*\d*\s*//;
# удаляем пробелы
s/ //g;
# матчим 5 или 6 цифр
/\d{5,6}/

tzukko
()
Ответ на: комментарий от tzukko

12345678

какой номер остался ? моим регекспом такой вариант к сожалению тоже матчится, надо, похоже, скобки или пробелы делать обязательными

Syncro ★★★★★
() автор топика
Ответ на: комментарий от Syncro

Если последний регексп заменить на /^\d{5,6}$/ то не матчит.
В моём варианте есть что дорабатывать - делал не очень вникая, для того, чтобы показать, что можно менее монструозно =)

tzukko
()
Ответ на: комментарий от tzukko

я уже почти отчаялся, но пара крыжиков сделали свое дело:)

/(?:^(?:8)|(?:[+]7)[- ]?\d{3}[- ]?\d{3}[- ]?\d{2}[- ]?\d{2}$)|(?:(?:^((?:8)|(?:[+]7)[- ]?[\(]?\d{3}[- ]?\d?[\)]?[- ]?)?(?:^\d{1,2}[- ]?\d{2}[- ]?\d{2}$)|(?:^\d{2,3}[- ]?\d{3}$)))/

Syncro ★★★★★
() автор топика
Ответ на: комментарий от Syncro

>если кто знает вариант покороче, буду признателен:)

Послушай совета, выкинь ты этот регэксп.

Выше уже дали хорошее решение. Выкидываем пробелы. Выкидываем скобки. Выкидываем тире. Меняем +7 на 8. Проверяем, что у нас нет ничего, кроме цифр. Считаем символы и говорим "да, такое количество символов может быть телефоном" или "нет, такое количество символов не может быть телефоном". Всё.

Я понимаю, хочется всунуть крутой регэксп, чтобы люди, которые потом будут читать код, говорили "ну ни фига себе, как крут был тот, кто это писал", но поверь мне, они скажут совсем другие слова ;)

MYMUR ★★★★
()
Ответ на: комментарий от MYMUR

Ну и на последнем этапе нужно запомнить, была замена +7 на 8 или нет. Если была, то количество цифр может быть только 11.

В общем, так будет В РАЗЫ читабельнее и сопроводибельнее.

MYMUR ★★★★
()
Ответ на: комментарий от Deleted

> Если номера телефонов вводятся пользователем, то ИМХО проще всего в программе/на_сайте сделать формочку, в которую номер телефона можно ввести только в строго определённом формате.
Формочки - зло. Натерпелся ещё с настройками TCP/IP в оффтопике. Туда даже скопипастить номер невозможно.

Не нужно перекладывать свои (разработчика) проблемы на пользователя, а то получится Виста.

naryl ★★★★★
()
Ответ на: комментарий от Syncro

если perl, то я предложу переписать в extended регулярку с каментами, иначе читать же невозможно.

teferiincub
()
Ответ на: комментарий от MYMUR

>Меняем +7 на 8

такого делать не надо, лучше 8 на +7

dimon555 ★★★★★
()
Ответ на: комментарий от MYMUR

> Меняем +7 на 8.

Наоборот в конце преобразований и проверив, что номер - из восьмёрочного постсовка.

LamerOk ★★★★★
()

так, строку, которую будет проверять, обязательно обойти и удалить все пробелы и тире.

тогда твой регэксп уменьшится вдвое, а смысл не потеряешь.

xydo ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.