Я пытаюсь собрать всеобъемлющее регулярное выражение для проверки телефонных номеров. В идеале он должен обрабатывать международные форматы, но он должен обрабатывать американские форматы, включая следующие:
1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
Я отвечу своей текущей попыткой, но я надеюсь, что у кого-то есть что-то лучше и / или более элегантно.
regex
validation
phone-number
Nicholas Trandem
источник
источник
555
в них, кроме911
?Ответы:
Лучший вариант ... просто уберите все нецифровые символы на входе (кроме «х» и начальных «+»), следя за тем, что британцы склонны писать цифры в нестандартной форме,
+44 (0) ...
когда их просят использовать международный префикс (в этом конкретном случае вы должны отказаться(0)
полностью).Затем вы получите такие значения, как:
Затем, когда вы показываете, переформатировать в свое содержание сердца. например
источник
Оказывается, есть что-то особенное для этого, по крайней мере для Северной Америки, под названием NANP .
Вам нужно указать именно то, что вы хотите. Что такое юридические разделители? Пробелы, тире и периоды? Разделитель не допускается? Можно ли смешивать разделители (например, + 0,111-222,3333)? Как будут обрабатываться расширения (например, 111-222-3333 x 44444)? А как насчет специальных номеров, таких как 911? Код города будет необязательным или обязательным?
Вот регулярное выражение для числа из 7 или 10 цифр, с разрешенными расширениями, разделителями являются пробелы, тире или точки:
источник
/(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/
(?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})
Если пользователи хотят дать вам свои номера телефонов, доверяйте им, чтобы они поняли это правильно. Если они не хотят давать его вам, то принуждение к вводу действительного номера либо отправит их на сайт конкурента, либо заставит ввести случайную строку, соответствующую вашему регулярному выражению. У меня даже может возникнуть желание посмотреть номер горячей линии по гороскопу премиум-класса и ввести ее вместо этого.
Я также хотел бы рассмотреть любое из следующих действий в качестве допустимых записей на веб-сайте:
источник
Я бы также посоветовал взглянуть на библиотеку Google " libphonenumber ". Я знаю, что это не регулярное выражение, но он делает именно то, что вы хотите.
Например, он признает, что:
это возможный номер, но не действительный номер. Он также поддерживает страны за пределами США.
Основные функциональные возможности:
getNumberType
- получает тип номера на основе самого номера; возможность различать фиксированные, мобильные, бесплатные, премиальные, общие, VoIP и персональные номера (когда это возможно).isNumberMatch
- получает уровень достоверности того, могут ли два числа быть одинаковыми.getExampleNumber
/getExampleNumberByType
- предоставляет действительные примеры номеров для всех стран / регионов, с возможностью указать, какой тип примера номера телефона требуется.isPossibleNumber
- быстро угадать, является ли номер возможным телефонным номером, используя только информацию о длине, намного быстрее, чем полная проверка.isValidNumber
- полная проверка номера телефона для региона с использованием длины и префикса информации.AsYouTypeFormatter
- форматирование телефонных номеров на лету, когда пользователи вводят каждую цифру.findNumbers
- находит числа при вводе текста.PhoneNumberOfflineGeocoder
- предоставляет географическую информацию, связанную с номером телефона.Примеры
Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.
(408) 974–2042
является действительным номером США(999) 974–2042
это не является допустимым количество США0404 999 999
является действительным австралийский номер(02) 9999 9999
также действительный австралийский номер(09) 9999 9999
это не является допустимым австралийский номерРегулярное выражение хорошо подходит для проверки формата телефонного номера, но на самом деле не удастся проверить правильность телефонного номера.
Я бы предложил пропустить простое регулярное выражение для проверки вашего телефонного номера и использовать такую библиотеку, как 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 для проверки и отображения телефонных номеров.
источник
07700000000
я получаюMissing or invalid default region.
ошибку. Но если я укажу код страны, он пройдет./^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i
Это соответствует:
На $ n это экономит:
Вы можете проверить это на https://www.regexpal.com/?fam=99127
источник
^
и$
или иначе я смог обойти его , используя[111] [111] [1111]
или111--111--1111
и тому подобное. (извините, удалил мой последний комментарий)^
и$
?[111] [111] [1111]
и111--111--1111
пока я не удалил^
и$
из регулярного выражения.Хотя ответ на удаление всех пробелов является аккуратным, он на самом деле не решает проблему, которая заключается в том, чтобы найти регулярное выражение. Возьмите, например, мой тестовый скрипт, который загружает веб-страницу и извлекает все номера телефонов с помощью регулярных выражений. Так как вам все равно понадобится регулярное выражение, вы можете также сделать так, чтобы регулярное выражение выполняло всю работу. Я придумал это:
Вот скрипт на Perl для его проверки. При совпадении $ 1 содержит код города, $ 2 и $ 3 - номер телефона, а $ 5 - добавочный номер. Мой тестовый скрипт загружает файл из интернета и печатает все номера телефонов в нем.
Редактировать:
Вы можете изменить \ W * на \ s * \ W? \ S * в регулярном выражении, чтобы немного его сжать. Я не думал о регулярном выражении с точки зрения, скажем, проверки пользовательского ввода в форме, когда писал его, но это изменение позволяет использовать регулярное выражение для этой цели.
источник
(4570457-6789
это было бы довольно распространенной опечаткой. Матчевые(^|[^\d\n])
(с включенным многострочным флагом) позволяет избежать общей проблемы, гарантируя, что ей не предшествует что-то числовое.Я ответил на этот вопрос на другом вопросе SO, прежде чем решил также включить мой ответ в качестве ответа в этой теме, потому что никто не обращал внимания на то, как требовать / не требовать элементов, просто раздавая регулярные выражения: Regex работает неправильно, сопоставляя неожиданные вещи
Из моего поста на этом сайте я создал краткое руководство, чтобы помочь каждому с созданием собственного регулярного выражения для своего желаемого формата номера телефона, который я предостерегаю (как я делал на другом сайте), что если вы слишком ограничены, Вы можете не получить желаемых результатов, и не существует единого решения, позволяющего принимать все возможные телефонные номера в мире - только то, что вы решите принять в качестве выбранного формата. Используйте на свой риск.
Быстрый шпаргалка
/^
[\s]
или\s
[(]
и[)]
. Использование\(
и\)
уродливо и может привести к путанице.?
после него-
или[-]
. Если вы не ставите его первым или последним в ряду других символов, вам, возможно, придется его избежать:\-
[-.\s]
потребуется дефис, точка или пробел. Знак вопроса после последней скобки сделает все эти поля необязательными для этого слота.\d{3}
: Требуется трехзначное число: 000-999. Сокращение для[0-9][0-9][0-9]
.[2-9]
: Требуется цифра 2-9 для этого слота.(\+|1\s)?
: Принять «плюс» или 1 и пробел (символ пробела,|
, «или») и сделайте его необязательным. Знак «плюс» должен быть экранирован.[246]
потребуется 2, 4 или 6.[77|78]
потребуется 77 или 78.$/
: Конец выраженияисточник
[2-9]
блок, который я поставил там. Это означает, что ваш минимум равен 2, а ваш максимум равен 9. Отрегулируйте соответственно.Я написал самое простое (хотя мне не нужна точка в нем).
Как упоминалось ниже, он проверяет только символы, а не его структуру / порядок.
источник
Если вы просто хотите убедиться, что у вас нет случайного мусора в поле (т. Е. От спамеров форм), это регулярное выражение должно работать хорошо:
Обратите внимание, что в нем нет специальных правил относительно количества цифр или допустимых чисел в этих цифрах, он просто проверяет, что только цифры, скобки, тире, плюс, пробел, фунт, звездочка, точка, запятая или буквы
e
,x
,t
присутствуют.Он должен быть совместим с международными номерами и форматами локализации. Предвидите ли вы необходимость разрешать квадратные, фигурные или угловые скобки для некоторых регионов? (в настоящее время они не включены).
Если вы хотите соблюдать правила для каждой цифры (например, коды США и префиксы (коды обмена) должны находиться в диапазоне 200-999), удачи вам. Поддерживать сложный набор правил, который может быть устаревшим в любой момент в будущем любой страной в мире, не кажется забавным.
И хотя удаление всех / большинства нечисловых символов может хорошо работать на стороне сервера (особенно, если вы планируете передавать эти значения в номеронабиратель), вы можете не захотеть сбрасывать вводимые пользователем данные во время проверки, особенно если вы хотите, чтобы они внести исправления в другом поле.
источник
Обратите внимание, что зачеркнутые
()
символы не работают для стиля записи британских номеров, который является общим:+44 (0) 1234 567890
это означает, что нужно набрать либо международный номер:+441234567890
либо набрать в Великобритании
01234567890
источник
Вы смотрели на RegExLib ?
Ввод номера телефона в США принес довольно большой список возможностей.
источник
Моя попытка неограниченного регулярного выражения:
Принимает:
Изгнанные:
Это зависит от вас, чтобы санировать его для показа. После проверки это может быть число, хотя.
источник
Я нашел, что это работает довольно хорошо:
Он работает для следующих числовых форматов:
Убедитесь, что вы используете глобальные и многострочные флаги.
Ссылка: http://www.regexr.com/3bp4b
источник
Если вы говорите о проверке формы, регулярное выражение для проверки правильного значения, а также правильных данных будет чрезвычайно сложным из-за различных стандартов страны и поставщика. Также будет сложно идти в ногу со временем.
Я интерпретирую вопрос как поиск широко действующего шаблона, который может быть внутренне непоследовательным - например, иметь действительный набор номеров, но не проверять, чтобы магистральная линия, обмен и т. Д. Соответствовали действительному шаблону для префикса кода страны. ,
Северная Америка проста, и для международного я предпочитаю использовать «идиоматический» шаблон, который охватывает способы, которыми люди указывают и запоминают свои номера:
Североамериканский шаблон гарантирует, что, если одна скобка включена, то обе. Международные счета для необязательного начального '+' и кода страны. После этого вы в идиоме. Допустимые совпадения:
(xxx)xxx-xxxx
(xxx)-xxx-xxxx
(xxx)xxx-xxxx x123
12 1234 123 1 x1111
12 12 12 12 12
12 1 1234 123456 x12345
+12 1234 1234
+12 12 12 1234
+12 1234 5678
+12 12345678
Это может быть предвзятым, поскольку мой опыт ограничен Северной Америкой, Европой и небольшой частью Азии.
источник
invalid quantifier
об ошибке. Есть идеи, что я делаю не так?Вот замечательный образец, который наиболее близко соответствовал проверке, которую мне нужно было достичь. Я не оригинальный автор, но я думаю, что стоит поделиться, поскольку я нашел эту проблему очень сложной и без краткого или широко полезного ответа.
Следующее регулярное выражение будет отлавливать широко используемые комбинации чисел и символов в различных форматах глобальных телефонных номеров:
/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm
Положительный:
+42 555.123.4567
+ 1- (800) -123-4567
+7 555 1234567
+7 (926) 1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292
Отрицательный:
926 3 4
8 800 600-APPLE
Первоисточник: http://www.regexr.com/38pvb
источник
Мои интуитивные ощущения подкрепляются количеством ответов на эту тему - что существует практически бесконечное количество решений этой проблемы, ни одно из которых не будет изящным.
Честно говоря, я бы порекомендовал вам не пытаться проверять номера телефонов. Даже если бы вы могли написать большой волосатый валидатор, который позволял бы использовать все допустимые форматы, он в конечном итоге позволил бы получить практически все, даже отдаленно напоминающее телефонный номер.
На мой взгляд, самым элегантным решением является проверка минимальной длины, не более того.
источник
Это простой шаблон регулярных выражений для филиппинских номеров мобильных телефонов:
или
будет соответствовать этим:
Первый из них будет соответствовать ЛЮБОЙ двухзначному коду страны, а второй - исключительно к филиппинскому коду страны.
Проверьте это здесь: http://refiddle.com/1ox
источник
Вот моя лучшая попытка до сих пор. Он обрабатывает форматы выше, но я уверен, что мне не хватает некоторых других возможных форматов.
источник
Вам будет трудно иметь дело с международными номерами с одним / простым регулярным выражением, см. Этот пост о трудностях международных (и даже североамериканских) телефонных номеров.
Вы захотите проанализировать первые несколько цифр, чтобы определить код страны, а затем действовать по-разному в зависимости от страны.
Помимо этого - список, который вы дали, не включает в себя другой распространенный формат США - опуская первоначальный 1. Большинство мобильных телефонов в США не требуют этого, и это начнет сбивать с толку молодое поколение, если они не набрали номер на международном уровне.
Вы правильно определили, что это сложная проблема ...
-Адам
источник
После прочтения этих ответов создается впечатление, что не было простого регулярного выражения, которое могло бы анализировать кучу текста и извлекать телефонные номера в любом формате (включая международный с плюсом и без него).
Вот что я недавно использовал для клиентского проекта, где нам пришлось преобразовать все телефонные номера в любом формате в тел: ссылки.
До сих пор он работал со всем, что они бросили на это, но если возникнут ошибки, я обновлю этот ответ.
Regex:
/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/
Функция PHP для замены всех телефонных номеров ссылками tel: (если кому-то интересно):
источник
+1 1234562222222222222222222222
.Я считаю, что Number :: Phone :: US и Regexp :: Common (в частности, источник Regexp :: Common :: URI :: RFC2806 модули Perl ) могут помочь.
Вопрос, вероятно, должен быть указан более подробно, чтобы объяснить цель проверки чисел. Например, 911 является действительным числом в США, но 911x не для любого значения х. Это так, что телефонная компания может рассчитать, когда вы закончите набор номера. Есть несколько вариантов по этому вопросу. Но ваше регулярное выражение не проверяет часть кода города, так что это не проблема.
Как проверка адресов электронной почты, даже если у вас есть действительный результат, вы не можете знать, назначен ли он кому-то, пока вы его не попробуете.
Если вы пытаетесь проверить пользовательский ввод, почему бы не нормализовать результат и покончить с этим? Если пользователь вводит число, которое вы не можете распознать как действительное число, либо сохраните его как введенный, либо удалите недоступные символы. В Number :: Телефон :: Нормализовать модуль Perl может быть источником вдохновения.
источник
Я работаю в компании, занимающейся исследованиями рынка, и мы должны фильтровать эти типы входных данных все время. Ты слишком усложняешь это. Просто удалите не алфавитно-цифровые символы и посмотрите, есть ли расширение.
Для дальнейшего анализа вы можете подписаться на одного из многих провайдеров, которые предоставят вам доступ к базе данных действительных номеров, а также сообщат вам, если они стационарные или мобильные, отключены и т. Д. Это стоит денег.
источник
Сделайте замену при форматировании символов, затем проверьте оставшиеся на действительность телефона. В PHP
Такое сложное регулярное выражение может быть столь же эффективным, но гораздо более простым.
источник
Я нашел это что-то интересное. Я не проверял это, но похоже, что это будет работать
источник
Возможно, вам лучше использовать замаскированный вход для этого. Таким образом, пользователи могут вводить цифры ТОЛЬКО, а вы можете форматировать их так, как считаете нужным. Я не уверен, если это для веб-приложения, но если это так, есть плагин jQuery очень щелчок, который предлагает некоторые варианты для этого.
http://digitalbush.com/projects/masked-input-plugin/
В своем уроке они даже рассказывают, как маскировать ввод телефонных номеров.
источник
Вот тот, который хорошо работает в JavaScript. Это в строке, потому что это то, что ожидал виджет Dojo.
Он соответствует 10-значному номеру NANP Северной Америки с дополнительным добавочным номером. Пробелы, тире и точки являются допустимыми разделителями.
источник
Я боролся с той же проблемой, пытаясь сделать свое приложение будущим, но эти ребята заставили меня двигаться в правильном направлении. Я на самом деле не проверяю сам номер, чтобы увидеть, работает ли он или нет, я просто пытаюсь убедиться, что была введена серия чисел, которые могут иметь или не иметь добавочный номер.
В худшем случае, если бы пользователю пришлось вытащить неформатированный номер из файла XML, он все равно просто набрал бы цифры на цифровой клавиатуре телефона
012345678x5
, и нет никакой реальной причины сохранять его красивым. Такой RegEx будет для меня примерно таким:01234467 extension 123456
01234567x123456
01234567890
источник
Я склонен согласиться с тем, что удаление не цифр и просто принятие того, что есть, лучше всего. Может быть, чтобы убедиться, что есть хотя бы пара цифр, хотя это запрещает что-то вроде буквенного телефонного номера "ASK-JAKE", например.
Пара простых выражений Perl может быть:
Используйте первый, чтобы объединить группы цифр, что может дать подсказки по форматированию. Используйте второй, чтобы тривиально бросить все не цифры.
Не стоит ли беспокоиться о том, что может потребоваться пауза и ввод дополнительных ключей? Или что-то вроде 555-1212 (подайте звуковой сигнал) 123?
источник
Должен заканчиваться цифрой, может начинаться с (или + или цифры, и может содержать + - (или)
источник
Для тех, кто заинтересован в том, чтобы сделать что-то подобное с ирландскими номерами мобильных телефонов, вот простой способ сделать это:
http://ilovenicii.com/?p=87
PHP
По этой ссылке также есть решение JQuery.
РЕДАКТИРОВАТЬ:
Решение jQuery:
Источник .
источник