регулярные выражения для мобильного телефона
Шаблон для номера телефона
Всем привет. У меня такой вопрос кто-нибудь знает RegExp шаблон для номера телефона (СНГ)? Желательно чтобы умел разбирать:
Буду рад любой помощи.
P.S. Пишу на JavaScript
3 ответа 3
Решил сделать так. Сначало отсеить все нецифровые значения номера, исключения сделать только для всяких скобо, дефисов, пробелов и т.д.
Потом привести их все к нормальному виду. Например вот так:
Ориентировано на российские мобильные + городские с кодом из 3 цифр (например, Москва). Пропускает:
Пользуюсь давно вот этой регуляркой и очень рад:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками регулярные-выражения javascript или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.11.40423
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Форматирование номеров телефона с помощью регулярных выражений
Такая элементарная вещь, как номер телефона, в письменных текстах живёт во множестве вариантов. Обыкновенный номер типа +7 (123) 123-45-67 можно встретить записанным без скобок или дефисов ( +7 123 1234567 ), а то и вообще без пробелов ( +71231234567 ). Не собираюсь оскорблять чувства пишущих, им и так непросто. Но уважающий себя веб-ресурс не может допустить такой типографической разношёрстности. Плюс к тому, необлагороженные номера неудобно читать человеку (то самое human-readable).
Данная статья о том, как привести все телефонные номера на странице к однообразному виду, а также проставить корректные ссылки типа tel: на них. Для решения поставленной задачи используются регулярные выражения JavaScript. Хороший обзор регэкспов дан здесь, также почитать по теме можно на MDN.
Найти все телефонные номера на странице можно таким способом:
Метод match() вернёт и запишет в переменную phoneNumbers массив (объект типа Array ) со всеми найденными на странице номерами.
Дисклеймер. Виденное выше регулярное выражение может вызвать сильное чувство боли в глазах у неподготовленного читателя. Если вы не очень знакомы с регулярками, автор всё-таки советует для начала проработать несколько первых глав учебника на LearnJavascript.
Разберём это выражение:
То есть, фактически, эти части паттерна распознают первые три цифры после кода страны, причём как взятые в скобки, так и без (квантификатор * синонимичен <0,>и означает «либо ноль, либо сколько угодно»).
Ну хорошо, найти все номера получилось. К сожалению, задача этим не исчерпывается. Как же взять и заменить все вхождения разом?
Но ведь у нас задача сложнее: нельзя же заменить разные номера телефонов на один! Тут самое время вспомнить о скобочных группах.
Скобочная группа — термин из теории регулярных выражений. Технически это просто часть паттерна, взятая в скобки. Но к любой такой группе можно обратиться по индексу.
То была идея, а теперь реализация:
В результате будет выведен аккуратный, каноничный телефонный номер. Работает!
Теперь, чтобы заменить все найденные номера телефонов на единообразные, добавим флаг g :
То есть, для корректной работы ссылки нужно в её коде выписать все цифры номера подряд — как раз самый неудобный для чтения человеком вариант.
Регулярное выражение для действительного международного номера мобильного телефона [дубликат]
этот вопрос уже есть ответ здесь:
Я использую Clickatell для отправки SMSes на мобильные телефоны клиентов.
существует ли стандартизированное регулярное выражение для всех действительных номеров мобильных телефонов, например +27 123 4567? Я бы ролл мой собственный, но я беспокоюсь о том, чтобы пропустить неясный, действительный формат номера телефона.
6 ответов
после удаления всех символов, кроме » + » и цифр с вашего ввода, это должно сделать это:
Если вы хотите быть более точным с кодами стран видят этот вопрос на список телефонных кодов стран
однако я бы постарался быть не слишком строгим с моей проверкой. Пользователи очень расстраиваются, если им говорят, что их действительные номера неприемлемы.
даже если вы пишете регулярное выражение, которое точно соответствует подмножеству «действительные номера телефонов» из строк, нет никакого способа гарантировать (посредством регулярного выражения), что они действительны мобильный телефонные номера. В нескольких странах номера мобильных телефонов неотличимы от номеров стационарных телефонов без поиска по крайней мере плана номеров, а в некоторых случаях даже это не поможет. Например, в Швеции многие люди «портировали» свои обычные стационарные телефоны номер их мобильного телефона. Это все тот же номер, что и раньше, но теперь он переходит на мобильный телефон вместо стационарного.
поскольку действительные номера телефонов состоят только из цифр, я сомневаюсь, что прокатка собственного рискует пропустить какой-то неясный случай номер телефона по крайней мере. Если вы хотите иметь лучшую определенность, напишите генератор, который принимает список всех действительных кодов стран и требует, чтобы один из них в начале телефонного номера соответствовал сгенерированное регулярное выражение.
Регулярное Выражение ^\+4<1>8<7,11>$ сбой для «+290 8000 » и аналогичных допустимых чисел, которые короче 8 цифр.
самые длинные номера могут быть чем-то вроде 3-значного кода страны, 3-значного кода области, 8-значного абонентского номера, что составляет 14 цифр.
хотя речь идет о международных числах, я бы хотел, чтобы код был таким :
Как вы можете иметь международные номера, начинающиеся с «00», а также.
размещение заметки здесь для пользователей, рассматривающих это в будущем. Google libphonenumber Это то, что вы скорее всего хотели бы использовать. Есть обертки для PHP, node.js, Java и т. д. чтобы использовать данные, которые Google собирает и уменьшает требования для поддержания больших массивов шаблонов регулярных выражений для применения.
/ / Regex-Проверьте Сингапур действительные мобильные номера
Создание регулярных выражений из диапазонов мобильных телефонных номеров
Я много работаю с VoIP-сетями. С коммерческим оборудованием, конечно тоже, но и очень много с OpenSource (статья пишется в контексте использования Asterisk PBX).
В телефонии часто возникает простая задача, разделить маршруты на определённые направления. Ну например, направить вызовы на городские номера в сторону оператора 1, МГ — в сторону оператора 2, МН — в сторону оператора 3.
Задача, в общем-то тривиальная, и реализуется на Asterisk легко:
Однако иногда возникает необходимость предоставить абоненту доступ только к мобильным телефонам его области, и здесь простым «_89XXXXXXXXX» не отделаешься.
Постановка задачи
Дело в том, что телефонные коды мобильных операторов являются негеографическими (т.н. DEF-коды), а это значит, что привязки кода к конкретному региону нет. Из-за этого в коде «900», например, есть диапазоны, принадлежащие операторам из Вологодской области, Псковской, Чеченской республики, и так далее.
Оператор мобильной связи теоретически может позволить себе выделить любой свободный диапазон в любом регионе, а это приводит к тому, что в разных регионах есть телефонные номера из разных диапазонов с разным количеством номеров. Например, в Вологодской области выделено 46 различных диапазонов, в Московской — 398.
Если бы все диапазоны были «красивыми», по 1000 или 10000 номеров, как например такой: 5100000 — 5109999 (10000 номеров в коде 914), то всё было бы более-менее хорошо.
Но зачастую большие диапазоны по 10000 номеров «разрезаются» на поддиапазоны из чисел, не кратных своему порядку (порядок количества чисел в диапазоне). Навскидку:
Код | От | До | Ёмкость | Регион |
958 | 2997500 | 2998749 | 1250 | Республика Адыгея |
958 | 2998750 | 2999999 | 1250 | Удмуртская Республика |
Или вообще по одному номеру (приводить не буду).
Подобный диапазон (2997500 — 2998749) одним регулярным выражением Asterisk не опишешь, в итоге получится 3 маршрута:
exten => _895829978XX,1,dial(SIP/itsp1/$
exten => _895829986XX,1,dial(SIP/itsp1/$
exten => _8958299873X,1,dial(SIP/itsp1/$
И это один конкретный диапазон. Если взять целый регион, то количество регулярных выражений резко увеличивается. В добавок ко всему с течением времени коды DEF имеют свойство меняться. Исчезают одни, появляются другие. Если вы этого не учитываете, это может привести к тому, что ваши абоненты в лучшем случае не смогут звонить на определённые диапазоны вашего региона.
Итак, задача сформулирована: Необходимо из любого количества любых диапазонов создавать регулярные выражения, которые распознает ваша телефонная станция.
Во всех источниках (МТТ, Министерство Связи РФ) фигурируют именно диапазоны, а не регулярные выражения. Так как работа по созданию маршрутов является скучной и рутинной, а мне приходится работать с разными регионами РФ, я решил её автоматизировать. Как ни странно, готовых инструментов я для этого не нашел.
Поэтому инструмент я сделал сам, а заодно и делюсь им со всеми. Эдакий сервис создания регулярных выражений :).
Решение
Возьмём произвольный диапазон (2633722 — 2673388). Человек легко создаст на его основе регулярные выражения. В итоге они получатся такими:
Поддиапазон | Регулярное выражение |
2633722-2633729 | _2633722 |
2633730-2633799 | _263373X |
2633800-2633999 | _26338XX |
2634000-2639999 | _2634XXX |
2640000-2669999 | _265XXXX |
2670000-2672999 | _2672XXX |
2673000-2673299 | _26731XX |
2673300-2673379 | _267336X |
2673380-2673388 | _2673383 |
Рассмотрим, как это делать автоматически.
Алгоритм
Реализация и возможности
Тонкостей при написании возникло много, и вряд ли их стоит здесь перечислять.
Исходный код доступен здесь. В нём много чего можно улучшить (пока в планах суммирование диапазонов перед 3-м пунктом алгоритма и добавление регулярных выражений других форматов, а так же полноценная работа из CLI с целью автоматизации регулярного обновления маршрутов на действующих серверах Asterisk), поэтому прошу писать мне все пожелания. Так же буду рад услышать рекомендации в плане веб-интерфейса и безопасности. Я не программист, поэтому качество кода может страдать.
Комплексное регулярное выражение для проверки номера телефона
Я пытаюсь собрать всеобъемлющее регулярное выражение для проверки телефонных номеров. В идеале он будет обрабатывать международные форматы, но он должен обрабатывать форматы США, включая следующие:
Я отвечу своей текущей попыткой, но Я надеюсь, что у кого-то есть что-то лучшее и/или более элегантное.
30 ответов
затем вы получаете такие значения, как:
затем, когда вы отобразите, переформатируйте содержимое своего сердца. например,
оказывается, для этого есть что-то вроде спецификации, по крайней мере для Северной Америки, называемой NANP.
вам нужно точно указать, что вы хотите. Что такое юридические разделители? Пробелы, тире и точки? Никаких разделителей? Можно ли смешивать разделители (например, +0.111-222.3333)? Как будут обрабатываться расширения (например, 111-222-3333 x 44444)? Насчет спец. номера, как 911? Код зоны будет необязательным или обязательным?
здесь регулярное выражение для 7 или 10-значного числа с разрешенными расширениями разделителями являются пробелы, тире или периоды:
Я бы также рассмотрел любую из следующих допустимых записей на веб-сайте:
я бы также предложил посмотреть на «libphonenumber » Библиотека Google. Я знаю, что это не regex, но он делает именно то, что вы хотите.
например, он распознает, что:
— это возможное число, но не допустимое число. Он также поддерживает страны за пределами США.
основные функции:
примеры
самая большая проблема с проверкой номера телефона-это очень культурно зависимый.
регулярное выражение отлично подходит для проверки формата номера телефона, но на самом деле оно не сможет проверить действия номер телефона.
я бы предложил пропустить простое регулярное выражение для тестирования ваш номер телефона против, и с помощью библиотеки, такие как Google libphonenumber (ссылка на проект GitHub).
представляем libphonenumber!
используя один из ваших более сложных примерах 1-234-567-8901 x1234 вы получаете следующие данные из libphonenumber (ссылка на онлайн-демо):
таким образом, вы не только узнаете, действителен ли номер телефона (который он есть), но и получаете согласованное форматирование номера телефона в вашем место действия.
в качестве бонуса, libphonenumber имеет ряд наборов данных для проверки правильности телефонных номеров, а также, поэтому проверка числа, такого как +61299999999 (международная версия (02) 9999 9999 ) возвращает как допустимое число с форматированием:
libphonenumber также дает вам много дополнительных преимуществ, таких как захват местоположения, в котором обнаружен номер телефона, а также получение информации о часовом поясе с телефона номер:
но недействительный австралийский номер телефона ( (09) 9999 9999 ) возвращает недопустимый номер телефона.
версия Google имеет код для Java и Javascript, но люди также реализовали библиотеки для других языков, которые используют набор данных телефона Google i18n:
если вы не уверены, что всегда будете принимать номера из одной локали, и они всегда будут в одном формате, я бы настоятельно рекомендовал не писать свой собственный код для этого и использовать libphonenumber для проверки и отображения телефонных номеров.