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

Тема в разделе "Регулярные выражения", создана пользователем danneo, 31 дек 2013.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. danneo

    danneo Честный

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

    Если кто сообразит, то можно сразу и для jquery валидацию :)
     
  2. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    Примерно так можно проверить валидность кода страны:
    Код:
    ^\+(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}$/*
    Он принимает такие варианты записи:
    но не принимает такие:
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    чет не понял... мне то нужно вместо
    только такой:
    чтобы страна, город и номер были разделены пробелами
    а так, в инете полно всякой ерунды... да не нужной...
     
  4. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Не уверен, что 100% захватывает все страны мира, но по идее должно работать:
    Код:
    \+\d{1,3}\s\d{2,5}\s\d{5,7}
     
  5. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Тс добавляете только те знаки которые нужно и все.
    Нарпимер так +7 (909) 1234567

     
  6. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    не понимаю... не хочет работать:

    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>';
                    }
                }
             
            }
    все варианты написания телефона не проходят.
    Что не так указать мог?
     
    Последнее редактирование: 31 дек 2013
  7. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    А в конце и начале слеши / и / ? Разве не надо?
    Код:
    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,}
     
    Последнее редактирование: 1 янв 2014
    danneo нравится это.
  8. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    насчет начала и конца строки, насколько я знаю, используют ^ и $... хотя...
    а вот по поводу [0-9] это цифры, можно и просто \d
    а ваш пример тоже не работает так как надо...
    Вот так правильнее:
    Код:
    preg_match('/\+[\d]{1,3}\s[\d]{2,5}\s[\d]{5,7}/is',$phone)
    вроде работает, как нужно... буду тестить...
     
  9. svfolder

    svfolder Постоялец

    Регистр.:
    31 июл 2013
    Сообщения:
    95
    Симпатии:
    39
    International Phone number
    Pattern: .\d+.\d{1,6}-\d{1,6}-\d{1,6}$

    http://www.regexr.com

    Склад готовых решений, не все конечно фонтан, но есть где подчерпнуть.
    Для поиска
    http://clip2net.com/s/6FhWOT

    задачка конечно нестандартная у вас...
     
  10. MAX_3000

    MAX_3000 Постоялец

    Регистр.:
    11 май 2009
    Сообщения:
    107
    Симпатии:
    53
    Можно еще так сделать - .\d+.\s?\d{1,7}(\D?)\d{1,6}\1\d{1,6} - более универсальное решение с учетом одинаковых знаков разделителей.
     
Статус темы:
Закрыта.