Помоги с регуляркой для телефонов всех стран (php)

Статус
В этой теме нельзя размещать новые ответы.

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Нужно составить регулярку для проверки номер телефонов, с учетом всех стран мира, городов.
Нужно так, например, для России:
+7 495 7800000

Если кто сообразит, то можно сразу и для jquery валидацию :)
 
Примерно так можно проверить валидность кода страны:
Код:
^\+(999|998|997|996|995|994|993|992|991| 990|979|978|977|976|975|974|973|972|971|970| 969|968|967|966|965|964|963|962|961|960|899| 898|897|896|895|894|893|892|891|890|889|888| 887|886|885|884|883|882|881|880|879|878|877| 876|875|874|873|872|871|870|859|858|857|856| 855|854|853|852|851|850|839|838|837|836|835| 834|833|832|831|830|809|808|807|806|805|804| 803|802|801|800|699|698|697|696|695|694|693| 692|691|690|689|688|687|686|685|684|683|682| 681|680|679|678|677|676|675|674|673|672|671| 670|599|598|597|596|595|594|593|592|591|590| 509|508|507|506|505|504|503|502|501|500|429| 428|427|426|425|424|423|422|421|420|389|388| 387|386|385|384|383|382|381|380|379|378|377| 376|375|374|373|372|371|370|359|358|357|356| 355|354|353|352|351|350|299|298|297|296|295| 294|293|292|291|290|289|288|287|286|285|284| 283|282|281|280|269|268|267|266|265|264|263| 262|261|260|259|258|257|256|255|254|253|252| 251|250|249|248|247|246|245|244|243|242|241| 240|239|238|237|236|235|234|233|232|231|230| 229|228|227|226|225|224|223|222|221|220|219| 218|217|216|215|214|213|212|211|210|98|95|94| 93|92|91|90|86|84|82|81|66|65|64|63|62|61|60| 58|57|56|55|54|53|52|51|49|48|47|46|45|44|43| 41|40|39|36|34|33|32|31|30|27|20|7|1)[0-9]{0, 14}$
Ну ладно, можно упростить:
Код:
^\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$
Есть вариант попроще:
Код:
*/^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/*
Он принимает такие варианты записи:
339-4248
(095)2569835
+7(095)1452389
+1(963)9632587
+12365874
2365789
но не принимает такие:
+12589637412
+19639632587
+1701234567
 
58|57|56|55|54|53|52|51|49|48|47|46|45|44|43| 41|40|39|36|34|33|32|31|30|27|20|7|1)[0-9]{0, 14}$[/CODE] Ну ладно, можно упростить:
Код:
^\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$
Есть вариант попроще:
Код:
*/^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/*
Он принимает такие варианты записи: но не принимает такие:
чет не понял... мне то нужно вместо
339-4248
(095)2569835
+7(095)1452389
+1(963)9632587
+12365874
2365789
только такой:
чтобы страна, город и номер были разделены пробелами
а так, в инете полно всякой ерунды... да не нужной...
 
Не уверен, что 100% захватывает все страны мира, но по идее должно работать:
Код:
\+\d{1,3}\s\d{2,5}\s\d{5,7}
 
Тс добавляете только те знаки которые нужно и все.
Нарпимер так +7 (909) 1234567

if(preg_match('/[^0-9\(\)\s\+]/',$_POST['phones'])){ echo ('Ошибка! Переданны не корректные данные');}


preg_match('/^[0-9]{1,4}-[0-9]{3}-[0-9]{3,4}-[0-9]{3,4}$/', $phone))
 
не понимаю... не хочет работать:

PHP:
elseif( is_array( $_phones ) ){
            foreach( $_phones as $phone ){
                if ( ! preg_match("\+\d{1,3}\s\d{2,5}\s\d{5,7}",$phone) ){
                    $insert_error = false;
                    $info_error_phone = '<div class="error_add_form">Телефон указан неправильно. Необходимо указать по шаблону</div>';
                }
            }
         
        }
все варианты написания телефона не проходят.
Что не так указать мог?
 
Последнее редактирование:
А в конце и начале слеши / и / ? Разве не надо?
Код:
preg_match("/\+[\d]{1,3}[\s\d]{2,5}[\s\d]{5,7}/is",$str,$ok2);

для того, чтобы показать, где начинается условие поиска (регулярное выражение), используют разделители, например, "слеши" (наклонная черта) или "тильды" (волнистое тире - "~":(

И еще скобки квадратные должны быть по идее.
Квантификаторы призванные на сокращение повторений записи (в фигурных скобках:( [a-z]{2}[0-9]{3} - символьная строка, состоящая из первых любых двух маленьких букв и трех любых цифр. [a-z]{1,3} - символьная строка, состоящая из одной, двух или трех маленьких английских букв. [a-z]{2,}
 
Последнее редактирование:
А в конце и начале слеши / и / ? Разве не надо?
Код:
preg_match("/\+[\d]{1,3}[\s\d]{2,5}[\s\d]{5,7}/is",$str,$ok2);

для того, чтобы показать, где начинается условие поиска (регулярное выражение), используют разделители, например, "слеши" (наклонная черта) или "тильды" (волнистое тире - "~":(

И еще скобки квадратные должны быть по идее.
Квантификаторы призванные на сокращение повторений записи (в фигурных скобках:( [a-z]{2}[0-9]{3} - символьная строка, состоящая из первых любых двух маленьких букв и трех любых цифр. [a-z]{1,3} - символьная строка, состоящая из одной, двух или трех маленьких английских букв. [a-z]{2,}
насчет начала и конца строки, насколько я знаю, используют ^ и $... хотя...
а вот по поводу [0-9] это цифры, можно и просто \d
а ваш пример тоже не работает так как надо...
Вот так правильнее:
Код:
preg_match('/\+[\d]{1,3}\s[\d]{2,5}\s[\d]{5,7}/is',$phone)
вроде работает, как нужно... буду тестить...
 
International Phone number
Pattern: .\d+.\d{1,6}-\d{1,6}-\d{1,6}$

Для просмотра ссылки Войди или Зарегистрируйся

Склад готовых решений, не все конечно фонтан, но есть где подчерпнуть.
Для поиска
Для просмотра ссылки Войди или Зарегистрируйся

задачка конечно нестандартная у вас...
 
Можно еще так сделать - .\d+.\s?\d{1,7}(\D?)\d{1,6}\1\d{1,6} - более универсальное решение с учетом одинаковых знаков разделителей.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху