Начиная с jQuery 1.7, вы должны использовать jQuery.fn.on
:
$(staticAncestors).on(eventName, dynamicChild, function() {});
До этого рекомендуется использовать live()
:
$(selector).live( eventName, function(){} );
Однако live()
устарел в 1.7 в пользу on()
и полностью удален в 1.9. Подпись live()
:
$(selector).live( eventName, function(){} );
... может быть заменена следующей on()
сигнатурой:
$(document).on( eventName, selector, function(){} );
Например, если ваша страница динамически создавала элементы с именем класса dosomething
, вы привязывали бы событие к родительскому, который уже существует (здесь есть нуль проблемы, вам нужно что-то, что существует для привязки, не привязка к динамическому контенту), это может быть (и самый простой вариант) - document
. Хотя иметь в виду document
, возможно, не самый эффективный вариант .
$(document).on('mouseover mouseout', '.dosomething', function(){
// what you want to happen when mouseover and mouseout
// occurs on elements that match '.dosomething'
});
Любой родитель, который существует в момент привязки события, прекрасен. Например,
$('.buttons').on('click', 'button', function(){
// do something here
});
применимо к
Лучшая опция ... просто разделите все незнаковые символы на входе (кроме знаков «x» и «впереди» +), заботясь о том, что британская тенденция писать числа в нестандартной форме +44 (0) ...
, когда попросил использовать международный префикс (в этом конкретном случае вы должны полностью отбросить (0)
).
Затем вы получите такие значения, как:
12345678901
12345678901x1234
345678901x1234
12344678901
12345678901
12345678901
12345678901
+4112345678
+441234567890
Тогда, когда вы показываете, переформатируете в свои сердца. например,
1 (234) 567-8901
1 (234) 567-8901 x1234
Вот замечательный образец, который наиболее точно соответствовал проверке, которую мне нужно было достичь. Я не являюсь оригинальным автором, но думаю, что это стоит того, что я считаю эту проблему очень сложной и без кратких или широко полезных ответов.
Следующее регулярное выражение будет использовать широко используемые числа и характер комбинаций в различных форматах телефонных номеров:
/^\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
/(?:(?:\+?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})/
– Brian Armstrong
7 September 2010 в 20:32
(?:(?:(\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})
– BandonRandon
9 January 2011 в 06:09
(4570457-6789
, которое было бы довольно распространенной опечаткой. Группы матчей также перекошены: rubular.com/r/TaTP0mHL5c
– SooDesuNe
20 February 2013 в 21:16
(^|[^\d\n])
(с включенным многострочным флагом) позволяет избежать общей проблемы, гарантируя, что ей не сразу предшествует нечто числовое.
– btown
23 March 2017 в 20:32
Я нашел это что-то интересное. Я не тестировал его, но похоже, что он будет работать
<?php
/*
string validate_telephone_number (string $number, array $formats)
*/
function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));
return (in_array($format, $formats)) ? true : false;
}
/* Usage Examples */
// List of possible formats: You can add new formats or modify the existing ones
$formats = array('###-###-####', '####-###-###',
'(###) ###-###', '####-####-####',
'##-###-####-####', '####-####', '###-###-###',
'#####-###-###', '##########');
$number = '08008-555-555';
if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
echo "<br />";
$number = '123-555-555';
if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
echo "<br />";
$number = '1800-1234-5678';
if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
echo "<br />";
$number = '(800) 555-123';
if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
echo "<br />";
$number = '1234567890';
if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>
Если вы просто хотите проверить, что у вас нет случайного мусора в поле (т. е. от спаммеров формы), это регулярное выражение должно делать красиво:
^[0-9+\(\)#\.\s\/ext-]+$
Обратите внимание, что он не имеет специальные правила для того, сколько цифр или какие числа действительны в этих цифрах, оно просто проверяет, что только цифры, скобки, тире, плюс, пробел, фунт, звездочка, период, запятая или буквы e
, x
, t
.
Он должен быть совместим с международными номерами и форматами локализации. Предусматриваете ли вы необходимость разрешать квадратные, кудрявые или угловые скобки для некоторых регионов? (в настоящее время они не включены).
Если вы хотите поддерживать правила на каждую цифру (например, в кодах и префиксах в США (коды обмена) должны находиться в диапазоне 200-999), хорошо, хорошо удачи вам. Сохранение сложного набора правил, который может быть устаревшим в любой момент в будущем в любой стране мира, не выглядит забавным.
И хотя удаление всех / большинства нечисловых символов может хорошо работать на сервере (особенно если вы планируете передавать эти значения в дозвонщик), вы можете не захотеть вогнать вход пользователя во время проверки, особенно если вы хотите, чтобы они вносили поправки в другое поле.
Это простой шаблон регулярного выражения для филиппинских номеров мобильных телефонов:
((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
или
((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
будет соответствовать этим:
+63.917.123.4567
+63-917-123-4567
+63 917 123 4567
+639171234567
09171234567
Первый будет соответствовать любому двухзначному коду страны, в то время как второй будет соответствовать исключительно филиппинскому коду страны.
Проверьте его здесь: http://refiddle.com/1ox
Я боролся с той же проблемой, пытаясь сделать мое приложение будущим доказательством, но эти ребята заставили меня идти в правильном направлении. Я фактически не проверяю номер, чтобы увидеть, работает ли он или нет, я просто пытаюсь убедиться, что была введена серия чисел, которая может иметь или не иметь расширение.
Худший случай если пользователь должен был вытащить неформатированный номер из XML-файла, они все равно просто набрали числа на номерной панели телефона 012345678x5
, и никаких реальных причин сохранить его довольно. Этот тип RegEx для меня выдаст что-то вроде этого:
\d+ ?\w{0,9} ?\d+
01234467 extension 123456
01234567x123456
01234567890
Если вы говорите о проверке формы, регулярное выражение для проверки правильного значения, а также правильных данных будет чрезвычайно сложным из-за разных стран и стандартов поставщиков.
Я интерпретирую этот вопрос как поиск широко допустимого шаблона, который может быть несовместим с внутренним состоянием, например, с допустимым набором чисел, но не подтверждая, что
Северная Америка проста, а для международных я предпочитаю использовать «идиоматический» шаблон, который охватывает способы, с помощью которых люди укажите и запомните их номера:
^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$
Североамериканский образец гарантирует, что если одна скобка включена, то и есть. Международные счета для необязательного первоначального «+» и кода страны. После этого вы находитесь в идиоме. Допустимыми совпадениями были бы:
(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
. Любые идеи о том, что я делаю неправильно?
– Jannis
17 October 2010 в 21:07
.*
Если пользователь хочет дать вам свой номер телефона, то доверьтесь ему, чтобы все было правильно. Если он не хочет отдать его вам, то заставляя его ввести действительный номер, он отправит его на сайт конкурента или заставит его ввести случайную строку, соответствующую вашему регулярному выражению. Возможно, у меня даже возникнет соблазн найти номер сексуальной линии премиум-класса и введите это вместо.
Я также рассмотрел бы любое из следующих утверждений на веб-сайте:
"123 456 7890 until 6pm, then 098 765 4321"
"123 456 7890 or try my mobile on 098 765 4321"
"ex-directory - mind your own business"
Моя попытка неограниченного регулярного выражения:
/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/
Принимает:
+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww
Отклоняет:
mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911
Это зависит от вас дезинфицировать его для отображения. После проверки его число было бы числом.
Я ответил на этот вопрос другим вопросом SO, прежде чем принять решение включить мой ответ в качестве ответа на этот поток, потому что никто не обращался к тому, как требовать / не требовать элементов, просто выдавая регулярные выражения: Regex работает неправильно, сопоставление неожиданных вещей
Из моего сообщения на этом сайте я создал краткое руководство, помогающее любому пользователю создать собственное регулярное выражение для собственного формата номера телефона, о котором я буду предупреждать (например, Я сделал это на другом сайте), что, если вы слишком ограничительны, вы не можете получить желаемые результаты, и нет решения «одного размера подходит всем» для принятия всех возможных телефонных номеров в мире - только то, что вы решите принять в качестве ваш формат выбора. Используйте на свой страх и риск.
/^
[\s]
или \s
[(]
и [)]
. Использование \(
и \)
является уродливым и может сбить с толку. ?
после него -
или [-]
. Если вы не ставите его первым или последним в ряд других символов, вам может потребоваться его избежать: \-
[-.\s]
потребует дефис, период или пробел. Значок вопроса после последней скобки сделает все из них необязательными для этого слота. \d{3}
: Требуется 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. Настройте соответствующим образом.
– vapcguy
7 January 2015 в 22:00
/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i
Это соответствует:
- (+351) 282 43 50 50
- 90191919908
- 555-8909
- 001 6867684
- 001 6867684x1
- 1 (234) 567-8901
- 1-234-567-8901 x1234
- 1-234-567-8901 ext1234
- 1-234 567.89/01 ext.1234
- 1(234)5678901x1234
- (123)8575973
- (0055)(123)8575973
В $ n он сохраняет:
Вы можете проверить его на https://www.regexpal.com/?fam=99127
^
и $
, иначе я смогу обойти его, используя [111] [111] [1111]
или 111--111--1111
и тому подобное. (извините, удалил мой последний комментарий)
– bafromca
7 March 2014 в 22:10
^
и $
?
– Ismael Miguel
7 March 2014 в 22:13
Я также предложил бы посмотреть в библиотеке Google libphonenumber . Я знаю, что это не регулярное выражение, но оно делает именно то, что вы хотите.
Например, он распознает, что:
15555555555
- это возможное число, но не действительное число. Он также поддерживает страны за пределами США.
Основные функции:
getNumberType
- получает тип числа, основанного на самом номере; isNumberMatch
- получает уровень уверенности в том, могут ли два числа быть getExampleNumber
/ getExampleNumberByType
- предоставляет действительные номера примеров для всех стран / регионов, с возможностью указать, какой тип номера номера телефона необходим. isPossibleNumber
- быстро угадывая, является ли число возможным номером звонка, используя только информацию о длине, намного быстрее, чем полная проверка. isValidNumber
- полная проверка номера телефона для региона с использованием информации о длине и префиксе . AsYouTypeFormatter
- форматирует номера телефонов «на лету», когда пользователи вводят каждую цифру. findNumbers
- находит номера в текстовом вводе. PhoneNumberOfflineGeocoder
- предоставляет географическую информацию, относящуюся к номеру телефона. Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.
(408) 974–2042
является действительным Номер в США (999) 974–2042
не является допустимым номером в США 0404 999 999
является действительным австралийским номером (02) 9999 9999
, также является действительным австралийским номером (09) 9999 9999
, не является действительным австралийским номером Регулярное выражение отлично подходит для проверки формата номера телефона, но на самом деле не будет возможности проверить действительность номера телефона.
Я бы предложил пропустить простое регулярное выражение, чтобы проверить ваш номер телефона, и использовать библиотеку, такую как libphonenumber
Google [ссылка на проект GitHub] .
Используя один из ваших более сложных примеров, 1-234-567-8901 x1234
, вы получаете следующие данные из libphonenumber
(ссылка на онлайн-демонстрацию) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Таким образом, вы не только узнаете, действительно ли номер телефона (какой он есть), но также вы получаете согласованную форму номера телефона
В качестве бонуса, libphonenumber
имеет ряд наборов данных для проверки правильности номеров телефонов, поэтому, проверяя число, например +61299999999
(международная версия (02) 9999 9999
) возвращает в качестве допустимого числа с форматированием:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber также дает вам много дополнительных преимуществ, таких как захват местоположения, в котором обнаружен номер телефона, а также получить информацию о часовом поясе с номера телефона:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Но неверный номер австралийского телефона ( (09) 9999 9999
) показывает, что он не является действительным номером телефона.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
Версия Google имеет код для Java и Javascript, но люди также реализовали библиотеки для других языков, которые используют набор данных телефона i18n для Google:
Если вы не уверены, что находитесь всегда собираюсь принимать номера из одной локали, и они всегда будут в одном формате, я бы сильно предложил не писать собственный код для этого и использовать libphonenumber для проверки и отображения номеров телефонов.
07700000000
Я получаю ошибку Missing or invalid default region.
. Но если я укажу код страны, он пройдет.
– BugHunterUK
29 November 2016 в 00:22
Вам, вероятно, было бы лучше использовать Masked Input для этого. Таким образом, пользователи могут ТОЛЬКО вводить цифры, и вы можете форматировать, как вы считаете нужным. Я не уверен, что это для веб-приложения, но если есть плагин jQuery с очень кликом, который предлагает некоторые варианты для этого.
http://digitalbush.com/projects/masked-input-plugin/
Они даже переходят к тому, как маскировать номера телефонов в их учебнике .
После прочтения этих ответов кажется, что не было простого регулярного выражения, которое может анализировать через кучу текста и вытаскивать телефонные номера в любом формате (включая международный с значком плюс и без него).
Вот что я недавно использовал для клиентского проекта, где нам нужно было преобразовать все телефонные номера в любом формате в tel: links.
До сих пор он работал со всем, что они бросили на это, но если возникнут ошибки, я обновлю этот ответ.
Regex:
/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/
PHP-функция для замены всех телефонных номеров на tel : ссылки (в случае, если кому-то интересно):
function phoneToTel($number) {
$return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
return $return;
}
+1 1234562222222222222222222222
.
– Varda Elentári
13 October 2015 в 18:39
Я нашел, что это работает довольно хорошо:
^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$
Он работает для этих форматов:
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
1-234-567-8901 ext. 1234
(+351) 282 433 5050
Обязательно используйте глобальные и многострочные флаги, чтобы убедиться.
Ссылка: http://www.regexr.com/3bp4b
pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$"
validateat="onsubmit"
Должен заканчиваться цифрой, может начинаться с (или + или цифры, и может содержать + - (или)
Я работаю в компании, проводящей исследования рынка, и мы должны фильтровать эти типы ввода в любое время. Вы слишком усложняете это. Просто разделите не-буквенно-цифровые символы и посмотрите, есть ли расширение.
Для дальнейшего анализа вы можете подписаться на одного из многих поставщиков, который предоставит вам доступ к базе данных действительных номеров, а также сообщит вам, если они стационарные или мобильные телефоны, отключены и т. д. Это стоит денег.
Я считаю, что Number :: Phone :: US и Regexp :: Common (особенно источник Regexp :: Common :: URI :: RFC2806 ) Могут помочь модули Perl.
Возможно, вопрос должен быть задан более подробно, чтобы объяснить цель проверки чисел. Например, 911 является допустимым числом в США, но 911x не имеет значения x. Это значит, что телефонная компания может рассчитать, когда вы закончите набор. Существует несколько вариантов этой проблемы. Но ваше регулярное выражение не проверяет часть кода области, поэтому это не вызывает беспокойства.
Как и для проверки адресов электронной почты, даже если у вас есть действительный результат, вы не можете знать, назначено ли оно кому-то, пока вы не попробуете его.
Если вы пытаетесь проверить ввод пользователя, почему бы не нормализовать результат и не сделать с ним? Если пользователь вводит номер, который вы не можете распознать как действительный номер, сохраните его как введенный или вычеркнутый недопустимый символ. Модуль Number :: Phone :: Normalize Perl может быть источником вдохновения.
Чувство моей кишки подкрепляется количеством ответов на эту тему - что существует практически бесконечное количество решений этой проблемы, ни одна из которых не будет элегантной.
Честно говоря, я бы рекомендуем не пытаться проверять номера телефонов. Даже если вы могли бы написать большой волосатый валидатор, который позволил бы использовать все различные законные форматы, он в конечном итоге разрешил бы практически все, даже отдаленно напоминающее номер телефона.
По моему мнению, самым элегантным решением является проверка минимальной длины, не более того.
Вот моя лучшая попытка. Он обрабатывает форматы выше, но я уверен, что мне не хватает других возможных форматов.
^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
Моя склонность заключается в том, чтобы согласиться с тем, что зачистка цифр и просто принятие того, что там лучше. Возможно, чтобы обеспечить хотя бы пару цифр, хотя это и запрещает что-то вроде алфавитного номера телефона «ASK-JAKE», например.
Несколько простых выражений perl могут быть:
@f = /(\d+)/g;
tr/0-9//dc;
Используйте первый, чтобы сохранить группы цифр вместе, что может дать ключи к форматированию. Используйте второй, чтобы тривиально подбросить все нецифровые символы.
Опасно ли, что может потребоваться пауза, а затем ввести еще несколько клавиш? Или что-то вроде 555-1212 (дождитесь звукового сигнала) 123?
Вот что хорошо работает в JavaScript. Он находится в строке, потому что это то, что ожидал виджет Dojo.
Он соответствует десятизначному номеру NANP Северной Америки с дополнительным расширением. Пробелы, тире и периоды являются принятыми разделителями.
"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
Вы посмотрели на RegExLib ?
Ввод номера телефона в США привел к появлению списка возможностей.
Сделайте замену на символы форматирования, затем проверьте оставшееся время действия телефона. В PHP,
$replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );
Разрыв такого сложного регулярного выражения может быть столь же эффективным, но гораздо более простым.
Рабочий пример для Турции, просто измените
d{9}
в соответствии с вашими потребностями и начните использовать его.
function validateMobile($phone)
{
$pattern = "/^(05)\d{9}$/";
if (!preg_match($pattern, $phone))
{
return false;
}
return true;
}
$phone = "0532486061";
if(!validateMobile($phone))
{
echo 'Incorrect Mobile Number!';
}
$phone = "05324860614";
if(validateMobile($phone))
{
echo 'Correct Mobile Number!';
}
У вас будет трудное время иметь дело с международными номерами с одним / простым регулярным выражением, см. этот пост о трудностях международных (и даже северных) телефонных номеров.
Вы хотите проанализировать первые несколько цифр, чтобы определить, что такое код страны, а затем действовать по-разному в зависимости от страны.
Кроме того - в списке, который вы указали, не содержится другой общий формат США - оставляя начальный 1. Большинство сотовых телефонов в США не требуют этого, и он начнет дезориентировать молодое поколение, если только они не набрали на международном уровне.
Вы правильно определили, что это сложная проблема ...
-адам
/(?:(?:\+?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})/
– Brian Armstrong
7 September 2010 в 20:32
(?:(?:(\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})
– BandonRandon
9 January 2011 в 06:09
(4570457-6789
, которое было бы довольно распространенной опечаткой. Группы матчей также перекошены: rubular.com/r/TaTP0mHL5c
– SooDesuNe
20 February 2013 в 21:16
(^|[^\d\n])
(с включенным многострочным флагом) позволяет избежать общей проблемы, гарантируя, что ей не сразу предшествует нечто числовое.
– btown
23 March 2017 в 20:32
Обратите внимание, что дескрипторы ()
не работают для стиля записи номеров Великобритании, которые являются общими: +44 (0) 1234 567890
, что означает набирать международный номер: +441234567890
или на британском циферблате 01234567890