Pull to refresh

Comments 121

Я когда-то фильтр писал, так там делал проще, брал все цифры со строки, отрезал последних 9 (код и номер телефона), и дописывал спереди +380 (код Украины), и разбивал регекспом на секции вида +380 (XX) XXX-XX-XX. Но это для мобильных, для стационарных работать должен немного иначе.
Для поиска украинских телефонов во всех файлах (в том числе веб-страницах и Word-документах, в том числе в файлах с кодировкой UNICODE 16 бит) использовал такое:

"/(?<!\w)(?:(?:(?:(?:\+?3)?8\W{0,5})?0\W{0,5})?[34569]\s?\d[^\w,;(\+]{0,5})?\d\W{0,5}\d\W{0,5}\d\W{0,5}\d\W{0,5}\d\W{0,5}\d\W{0,5}\d(?!(\W?\d))/x"

Для уменьшения уровня «шума» и снижения чувствительности {0,5} заменить на {0,3} (или еще меньше).
Этот шаблон так же вытаскивает семизначные номера (без кода города, подразумевая, что это Киев).
Основной отсев ведется по [34569].
почему не указали что выражение работает только для российских телефонов?
В моём городе код города — 4 цифры, номер телефона — 6 цифр.
Ваш валидатор не пропускает такие номера. Есть города, где номер телефона состоит из 5-ти цифр.
Всё нормально. Это синдом ДС.
Это не нормально. Но да, синдром ДС.
Сарказм, бро. Если серьёзно, то это частный случай и за такое бо-бо надо делать. Конечно, если ваш сайт не заблокирован для всех кроме мегаполисов с трехзначным кодом.
*Систер.
Я поняла) Но вдруг кто-то подумает, что это действительно нормально ;)
Пардон, мадемуазель, Вы обваражительны сегодня.
UFO just landed and posted this here
А мне почему — то в голову пришло синдром Древнего Совка.
а я подумал про синдром Двух Столиц О_о
Простите, а чем ТС виноват что в вашем городе не семизначные номера телефонов?
И почему тогда только москвичи виноваты? В том же Санкт-Петербурге те же 7цифр плюс 812?
В этом никто не виноват. Они просто есть. Но регулярное выражение в топике об этом не знает.

И где было хоть слово про москвичей? Почему вы стараетесь обвинить меня в том, чего не было?
А «синдром ДС» в вашем комментарии тогда что значит? Washington DC?
Ну так может ТС нет необходимости не в семизначных номерах, поэтому он и не делал их обработку? Собственно в посте он об этом и говорит, но вам же надо написать про «синдром ДС»…
«синдром ДС» намного более широкое выражение, чем «живет в Москве». Оно может означать, что автор не приемлит никаких стандартов, с которыми он может столкнуться, кроме своего города. Или неосознанно подразумевает, что его город — единственный в мире. Вот например, я бы сказала «встречаемся на метро Политех». И хотя имею ввиду Киев, петербуржане могут неправильно понять. Москва вообще не задействована. Но «синдром ДС» во всей красе.
У вас синдром ДС, вы же сразу не указали в каком городе и стране находится станция метро.

Спасибо, капитан! Об этом я и говорю!
А я говорю о том, что не надо тыкать этим «синдромом», его может и не быть изначально.
Писать на интернациональном сайте что-то подходящее под узкий круг городов, не указывая при этом перечень городов — не это ли «Синдром ДС»?
А вам в голову не приходило, что прежде чем писать что это «синдром ДС» можно автору сказать чтобы уточнил?
Потому что сразу орать про какие то синдромы выглядит как синдром «синдрома ДС»
А вам не приходило в голову, что автор должен был подумать хоть немного при написании статьи?
О чем? ТС написал регулярку под свои задачи (7+3 телефоны), решил поделиться, ему что, обязательно надо было подумать что это не подойдет для 4+6 и 5+5 номеров и делать то, что выходит за рамки ЕГО задачи?
А инструкция по установке апача должна включать инструкцию по установке всех возможных ОС на которых апач может работать?
ТС сразу указал на каких строках это работает, кому не нравится — пишет свою регулярку и вешает в комменты или статью.
А если я напишу функцию, которая определяет, оканчивается ли строка $xxx строкой $yyy. Мне об этом тоже поделиться на Хабрахабр? ;)
отдельным топиком при чем
Безграмотные девочки вообще не должны писать топики
Ну вот написал бы он для пятизначных и вы бы тут выступали, но ведь он не виноват что в Питере семизначные, да?
Внимательно читайте, ТС написал на какие номера ориентирована регулярка, но у некоторых такой «синдром ДС», что они не могут не сдержаться и не заявить об этом «синдроме»
Когда написал? После комментариев? ;)
UFO just landed and posted this here
а что, за мкадом есть телефоны???
Ага, через телефонистку.
<regexp-nazzi>
Зачем вы пишите \d{1}?
Зачем у вас -?\d{1} повторяется 7 раз?
</regexp-nazzi>

Прочтите и не позорьтесь так — www.books.ru/shop/books/592346
а скобки в конце не заметил? :)
Согласен, что можно было чуток сократить выражение, но я не считаю это позором ;)
таки должно быть немножко стыдно. особенно за \d{1} ;)
Это не позор. Это МЕГА позор
В России междугородний телефон состоит из 10 цифр, всегда. Размера кода города варьируется в зависимости от длины номеров городских станций. Т.е. варианты могут быть разные.
Более того, код города и длина номеров ГТС может быть переменной длины в одном городе (5/5 или 4/6 точно знаю, что были не так давно и, наверное, есть до сих пор).
В России межгород НЕ ВСЕГДА из 10 цифр состоит.
Все зависит от того, через какого оператора производится дозвон (поскольку, с 1 января 2006 года абоненты имеют право самостоятельно выбирать, услугами какого оператора связи пользоваться).
Например, используя код МТТ (53) в Санкт-Петербург можно звонить так:

8-гудок-53-812-123-45-78

то есть набирается 12 цифр после 8.
Хм, я честно говоря не знаю, что это за особенность. Но разве номер абонента изменяется от такого набора? Номер абонента остается прежним, просто вызов пойдет по сетям определенного оператора(если я правильно понял смысл этой приставки).
Номер абонента: 123-45-78, а, все остальное — «приставки».
Дело не в этом. Просто, благодаря такой схеме адресации появляется возможность неограниченно наращивать номерную ёмкость конкретной телефонной станции (без применения добавочных номеров, набираемых уже после дозвона).
Компания МТТ просто пошла по пути наименьшего сопротивления, чтобы не заставлять своих абонентов запоминать сложные схемы переадресации, зарегистрировав на себя все «виртуальные» трехзначные коды «городов» 533, 534 и 538 (которые полностью покрывают территорию всей Российской Федерации с кодами городов 3хх, 4хх и 8хх), а, так же, коды 58х для для выхода на международные линии.
Другими словами, количество цифр в номере может зависеть и от кода города (особенно, виртуального).
То есть, набрав номер, 8-гудок-58-380-44-123-45-67 мы дозваниваемся до Киева (14 цифр после восьмерки), в самом же Киеве номера 7-значные.
Компания МТТ — не единственный оператор связи, владеющий «виртуальнми» кодами городов.
Есть компании, сдающие в «аренду» некоторые номерные пространства, и арендатор вправе по своему усмотрению произвольно «удлиннять» набираемый номер.
Я просто знаю, что все междугородние номера которые ставятся на контроль в сорме являются деситизначными, собственно поэтому я и стал утверждать то, что утверждаю. Я, лично, других междугородних номеров ни разу не видел, да и сорм делается по стандартам и приказам мин связи. Полным номером абонента который проходит по коммутаторам будет (код_города)(номер_абонента) все остальное будет отброшено(справедливо для транзита, местные абоненты по другому могут быть).
Ну а если перевести все это на тему топика, то абонент оставляет свой номер телефона, который никто оставлять не будет с префиксом маршрутизации оператора(в здравом уме :) ).
Безусловно, то о чем Вы говорите, может иметь место, но приставки о которых говорите Вы не являются префиксом дающим уникальность абонентского номера, в отличие от деситизначного номера, который идет вслед за ними. Т.е 10 знаков являются обязательными, а все остальное это некий добавочный «сахар».
Компания МТТ через «префикс» строит всего лишь удобную схему для доступа к «мосту» между различными телефонными сетями (за счет переадресации вызова).
К сожалению они не делают переадресации с префиксом «53» на мобильные телефоны.
Просто я хотел себе на мобильник позвонить, и посмотреть, что по этому поводу скажет определитель номера.
Но ведь никто не заставляет «арендаторов» использовать арендуемые номера именно в качестве шлюза на другие номера (которые будут совпадать, даже, хотя бы, частично по последним семи цифрам).
Например, при желании можно «заполучить» номерок вида
8-5хх-1234567890123456789,
который можно будет запросто указывать в качестве контактного номера в любых анкетах, и до него реально будет дозвониться, и при этом, оригинальный номер, на который будет проводиться переадресация будет скрыт (ну или по крайней мере не будет жестко привязан к «длинному» номеру).
Кстати я очень часто звоню по «бесплатным» номерам вида 8-800-ххх-хх-хх, и при этом на экране телефона отображается номер на который идет переадресация.
Интересная тема, надо будет поизучать на досуге. Спасибо!
Кстати, да. Например у Кировска (Лен. область) код 81362, а номера 5-и значные
По заголовку подумал что пост будет об этом номере: 8 (495) 933-66-66
зачем изобретать велосипед? стоит покопаться в интернете и как минимум найти более эффективные регулярки, а у вас получилась регулярка для сотового телефона в большинстве своём
Затем, что существуют велосипеды различных марок и моделей. Есть Stels, а есть — Colnago.
Здесь — решение конкретной задачи: чтобы в форме проверялись телефоны, которые вводят клиенты. Телефоны, как вы правильно заметили, в основном ожидаются мобильные. Разумеется, я предварительно «покопался в интернете». Если есть более эффективное решение — пожалуйста, в студию. Я добавлю в пост.
Извините, но у вас велосипед марки «инвалидная коляска».
Ваше решение ужасно по многим пунктам, в т.ч. описанным в топикам.
Пользователь введёт телефон «8-926-123-45-67». И что ему сообщит? Что это неправильный номер? Но как это может быть неправильным номером, если ему только что на него звонила мама?
А то, что для вас не существует других телефонов кроме московских — тоже показательно.
И еще ваша регулярка всё-равно не защитит от таких значений, как «8(000)0000000»
Так что послушайте советов в топике — не делайте таких глупых проверок. Достаточно проверки на длину. Иначе просто потеряете потенциального клиента.
А во время ввода — автоматически подгонять формат к нужному.
Спасибо, пофиксил.
То же самое вы могли сказать вот так: «Добавьте в тесты выражение 8-926-123-45-67».
Нуточка, совесть вы наша ) у каждой истории есть две стороны. Вторая — это обработка заявок отделом продаж.
Согласна с вами абсолютно =) Потому можно спросить у директора предприятия, что лучше — потерять одного потенциального клиента, или случайно пропустить в отдел продаж один несуществующий номер ;)
Принять любой номер, выкинуть из него всё, что не цифра (или плюс в самом начале) и уже после этого пытаться его проверять на разумность.
То же самое вы могли сказать вот так: «Добавьте в тесты выражение 8-926-123-45-67»

Тогда можно сказать ещё добавить в выражение следующие тесты:
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123

Люди чисто покупают телефоны с красивыми цифрами и потом недоумевают, почему их не принимают сайты =) На самом деле много еще вариантов можно придумать.
Обратите внимание, все телефоны — вполне реальны и за ними могут сидеть вполне реальные клиенты ;)
Не обижайтесь, ничего лично против вас не имею, но ведь ваша регулярка может оказаться на реальном сайте, на котором я не смогу ввести свой реальный телефон!
Я думаю, что наличие на сайте регулярного выражения, не позволяющего ввести телефон — повод наказать этот сайт (компанию, которая за ним стоит и выбрала такого горе-разработчика) рублем путем отказа от их услуг — в подавляющем большинстве случаев это возможно.
Глупства, пане, глупства.
По-моему, стоит просто приводить номер к «правильному» виду и показывать пользователю, чтобы тот мог что-то поправить, если что. А «не пущать» — порочная практика.
Клиент всегда прав.
Такая вещь почти обязательна для компаний, которые тем или иным образом предоставляют операции с большими группами номеров.
Один пример: сервис смс рассылки. Пусть клиент загружает номера в любом виде, а в ответ ему сообщить что из вашей 1000 обработали 990 номеров (остальные вообще бред). Поверьте, у клиентов бывают базы в таком жутком виде!, а сам он недавно электронные таблицы освоил. Так что либо принимать такие номера, либо никакие
Ну, отвергать надо номера недостаточной длины. Точнее, не отвергать, а переформатировать и подсветить красным. И сообщить, что нифига они обработаны не будут, пока их не исправят.
Кстати, насчет электорнной таблицы верно подмечено:
помню, нужно было обработать несколько экселевских таблиц с кучей номеров телефонов, и я решил сохранить все в текстовом формате «csv».
В итоге я получил для номеров, которые были записаны без скобок, пробелов и минусов номера вида «8,92E+10» с которыми, конечно же бессмысленно было работать дальше.
Регулярное выражение не лучший способ, для разбора номера.
Особенно по скорости работы и разбора такого выражения другими программистами ;)
Я б предварительно почистил от лишних и множественных пробелов/табуляции/недопустимых символов и прочей нечисти, а потом уже валидировал
Поддерживаю. Тогда валидация оказывается очень простой, как ни странно.
Да, согласен, наверное, это самое эффективное решение.
К сожалению, я заранее отказался от него: некоторые посетители (например, конкуренты) злоупотребляют таким способом валидации и сознательно отправляют недопустимые символы в телефоне. Из опыта: такие заявки лучше всего просто фильтровать. Они тратят время и портят настроение отделу продаж.
Вы что-то не догоняете, видимо
Вы еще забыли про добавочные, которыми пользуются в больших организациях. Например, Иванов И.И. +7 812 123-4567 доб. 123.
А как на добавочный отправить факс или текст автоматизированно?
Можно вставлять в набор паузу или две.
Так а SMS (texts) как отправить? Там пауз нет.
а эта регулярка только для номеров, на который компьютер может отослать смс
или для номеров, по которому можно дозвониться клиенту?
Из одной регулярки сделали пост на главной?

Совсем не торт.
ладно б если бы регулярка еще и работала при этом
> ^( +)?((\+?7|8) ?)?((\(\d{3}\))|(\d{3}))?( )?(\d{3}[\- ]?\d{2}[\- ]?\d{2})( +)?$

Простите, а как понимать номер 8 927 00 00?
Клиенты пишут:

— 4951234567890 (и такой же, но на конце «1»)
— +74951234567890 (но у меня там денег нет обычно)
— и т. п.

Никто не будет карпеть над вашей формой, плюнут и пойдут к другому поставщику услуг. Достаточно написать пример правильного написания.
Это реальные примеры? О_о
Это типовые примеры клиентов, которые подают заявку на обучение по программам MBA и ВПО

— Место работы: на банке
— Место работы: госорган, Должность: госслужащая
— Место работы: санкт петербург, Должность: бухгалтер
— Должность: приемчик товара
— Должность: нету

Они пишут свое ФИО с маленькой буквы или капсом. А мы здесь хотим их заставить правильно вводить номера телефонов по регуляркам, ну что за.
ТС начал учить регулярные выражения?
UFO just landed and posted this here
и еще замечание, дефисоминусы можно не экранировать, а вместо пробелов использовать специальный символ \s.
И, как сказано выше, наверное в данном случае правильней, убирать все нечисловые символы, и потом проверять на длину.
А на какую длину? =) На примере украинских номеров:
+380671234567
  80671234567
   0671234567
Ну вот, 3 варианта. На них и проверить.
А, еще, 671234567 и 1234567.

Кстати, мой вариант регулярного выражения все эти варианты успешно распознает.
UFO just landed and posted this here
UFO just landed and posted this here
УРА!!!
Давайте теперь для каждой тупой регулярки создавать новый пост на хабре!
Я удивляюсь тем, кто вывел его на главную.
хабр уже не торт.
завтра на главной мы рискуем увидим посты о валидации емайлов и айпишников
Регулярно появляются ведь!
ну тут хоть посерьезнее чем тот хеловорд, что сотворил автор топика
Если вы уверены, что на вашем сайте все номера должны будут иметь вид +7 (XXX) XXX-XX-XX, то имеет смысл просто выкидывать все символы кроме цифр и потом выводить как вам угодно.

А в случае, если вы работаете на уровне страны или всего мира, то без базы кодов городов не обойтись.

Вот это можно записать немного проще:
^((\+?7|8)[ \-] ?)?((\(\d{3}\))|(\d{3}))?([ \-])?(\d{3}[\- ]?\d{2}[\- ]?\d{2})$

[ \-] лучше заменить на [\s-] #символ '-' можно не экранировать если он идет последним
используя ' ' в регулярках вы закрываете себе возможность использовать многострочные regexp, поэтому лучше использовать \s

А вы в курсе, что \d совпадает с юникодными цифрами? Например, с арабо-индийскими, вьетнамскими и т.п. Я бы заменил на [0-9].
В первоначальную маску так же успешно попадают:

8 (926 123-45-67
8 926) 123-45-67
8-926-123-45----

предложенный упрощенный вариант лишен этого деффекта.
Это всё здорово, но в чём суть поста? Если это действительно востребовано, то давайте поступим следующем образом: любой хабражитель отправит мне в инбокс пожелания по нужным ему рег. выражениям, а я их составлю и оформлю в один отдельной пост. И если в последующем будет потребность ещё в каких-то рег. выражения — я просто буду обновлять пост, добавляя нужное рег. выражение.

Идёт?)
Возможно пригодиться и моя наработка в этой области кому-то. Конечно своеобразный костыль, но получилось что-то своеобразное:

vit1251.wordpress.com/2010/07/09/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0-%D1%82%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%B0-%D0%B8%D0%BB%D0%B8-%D0%B2%D0%B2%D0%BE%D0%B4-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80/
Думаю, если так важны валидные номера телефонов, то нужно
а) при внесении телефона форму использовать проверку только на правильность количества цифр. (т.е. минимум столько-то)
б) при необходимости проверить действительно ли этот номер телефона принадлежит владельцу — подтверждение с помощью смс.

Конечно, если ресурс серьезный — без базы не обойтись.
UFO just landed and posted this here
в некоторых странах мира ещё указывают свой номер начиная с 00 (двух нулей) вместо + (плюса)
UFO just landed and posted this here
Регулярка ничо такая, но гораздо проще убрать всё кроме букв, проверить длину, проверить код (по желанию)
Сделал так:
'/^([0-9]){1,5}$/' — для кода страны и кода города (отдельно для каждого)
'/^([0-9]){3,10}$/' — для прямого номера

application form
(разрешены только цифры с проверкой по длине)

Мне казалось, максимально удобно, с подсказками и подсветкой красным полей, которые заполнены не правильно. Но, некоторые люди всеравно пытаются целый номер
вставить то в 4х символьное поле для кода страны, то в поле кода города и даже после подсветки и нескольких попыток сабмита формы несколько человек ушли, не пройдя этот этап из-за телефонного номера.

Думаю еще добавить примечание внизу страницы, как заполнять некоторые поля.
Вобщем, счс дорабатываю форму и буду признателен за комментарии по юзабилити.
Не знаю, какую истину нашёл автор, но номера с 4-значными кодами как не матчились, так и не матчатся.
Регулярка для валидации номера телефона на главной? Абсурд
кг/ам (я про автора статьи..)
Поддерживаю!
Регулярка в одну строчку, пишется минут за 10. Автор, даешь посты про валидацию номеров ICQ, логинов Skype и прочих очень «сложных» и «интересных» вещах?
регулярка найдёт и не корректные, ну на пример введя не 10 цифр, а 11, когда же в РФ всего 10 после восьмёрки.
вот так будет находить все номера, без разницы где стоят тире и скобки

m/^+?[78](?:[-()]*\d){10}$/
Есть такой дивный сайтик slando.ru, где одному телефонному номеру запрещено продавать больше одной квартиры. Риелторы извращаются как могут.
Так ваши регулярки — просто детский лепет для тех телефонов, которые там указывают. Человек то их прочитает.
если уж совсем подумать то лучше без регулярки, зачем валидировать телефон? Разве что смску скинуть уведомлением
UFO just landed and posted this here
Какие ожесточенные обсуждения… Ваш пост много кого не оставил равнодушным))
Истину?

Тогда почему 1234567890123 подходит?
Пост-валидация междугородных телефонов Российской Федерации (после удаления добавочного номера а так же всех «левых» символов кроме цифр и плюса вначале) с учетом действующего Телефонного плана нумерации, (в том числе, кодов альтернативных операторов дальней связи):

"/^(?:8(?:(?:21|22|23|24|51|52|53|54|55)|(?:15\d\d))?|\+?7)?(?:(?:3[04589]|4[012789]|8[^89\D]|9\d)\d)?\d{7}$/"

Отбрасывает номера вида:
+70000000000
+77777777777
+78901234567
87654321098
88888888888
81234567890

которые для «непосвященных» выглядят как корректные.
распишите пожалуйста почему они неправильные

Регулярка не рабочая.
не ловит:
+7(8181)123456
криво ловит
+7(8181)12-34-56
ловит кривое
8182 1234567801


вроде как и условия просты, всего 2:
1) начинается с +7 или 8
2) содержит не более 10 цифр (не считая +7 или 8) между которыми могут встречаться только пробел(не более 1 подряд), -, (, )

Sign up to leave a comment.

Articles