regex - синтаксис - регулярные выражения шпаргалка




Полное регулярное выражение для проверки номера телефона (20)

Я пытаюсь собрать всеобъемлющее регулярное выражение для проверки номеров телефонов. В идеале он будет обрабатывать международные форматы, но он должен обрабатывать форматы США, в том числе следующие:

  • 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. Большинство сотовых телефонов в США не требуют этого, и оно начнет дезориентировать молодое поколение, если только они не набрали на международном уровне.

Вы правильно определили, что это сложная проблема ...

-Адам


Вот замечательный образец, который наиболее точно соответствовал проверке, которую мне нужно было достичь. Я не автор оригинала, но я думаю, что это стоит того, что я считаю эту проблему очень сложной и без кратких или широко полезных ответов.

Следующее регулярное выражение будет использовать широко используемые комбинации чисел и символов в различных форматах глобальных телефонных номеров:

/^\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


Вы просмотрели RegExLib ?

Ввод номера в США привел к полному списку возможностей.


Если вы говорите о проверке формы, регулярное выражение для проверки правильного значения, а также правильных данных будет чрезвычайно сложным из-за разных стран и стандартов поставщиков. Также будет сложно следить за обновлениями.

Я интерпретирую этот вопрос как поиск широко допустимого шаблона, который не может быть внутренне согласован - например, имея действительный набор чисел, но не проверяя, что магистральная линия, обмен и т. Д. Действительный шаблон для префикса кода страны ,

Северная Америка проста, и для международных я предпочитаю использовать «идиоматический» шаблон, который охватывает способы, которыми люди указывают и запоминают их номера:

^((((\(\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

Это может быть предвзятым, поскольку мой опыт ограничен Северной Америкой, Европой и небольшим количеством Азии.


Лучший вариант ... просто разделите все символы, отличные от цифр на входе (кроме «x» и «ведущих» знаков +), заботясь о том, что британская тенденция писать числа в нестандартной форме +44 (0) ... когда его попросят использовать международный префикс (в этом конкретном случае вы должны полностью отказаться от (0) ).

Затем вы получаете такие значения, как:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

Затем, когда вы показываете, переформатируйте содержимое вашего сердца. например

  1 (234) 567-8901
  1 (234) 567-8901 x1234

Мое чувство кисти подкрепляется количеством ответов на эту тему - что существует практически бесконечное количество решений этой проблемы, ни одна из которых не будет элегантной.

Честно говоря, я бы рекомендовал вам не пытаться проверять номера телефонов. Даже если вы могли бы написать большой волосатый валидатор, который позволил бы использовать все различные законные форматы, он в конечном итоге разрешил бы практически все, даже отдаленно напоминающее номер телефона, в первую очередь.

На мой взгляд, самым элегантным решением является проверка минимальной длины, не более того.


Обратите внимание, что символы stripping () не работают для стиля записи чисел в Великобритании, которые являются общими: +44 (0) 1234 567890 что означает набрать либо международный номер:
+441234567890
или в Великобритании наберите 01234567890


Оказывается, для этого есть что-то особенное, по крайней мере для Северной Америки, называемое 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*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

Хотя ответ на стирание всех пробелов является опрятным, на самом деле он не решает поставленную задачу, которая заключается в поиске регулярного выражения. Возьмем, например, мой тестовый скрипт, который загружает веб-страницу и извлекает все номера телефонов с помощью регулярного выражения. Поскольку в любом случае вам понадобится регулярное выражение, вы также можете заставить регулярное выражение выполнить всю работу. Я придумал это:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

Вот скрипт perl, чтобы проверить его. Когда вы сопоставляете, $ 1 содержит код области, $ 2 и $ 3 содержат номер телефона, а $ 5 содержит расширение. Мой тестовый скрипт загружает файл из Интернета и печатает все номера телефонов в нем.

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"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",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

Редактировать:

Вы можете изменить \ W * на \ s * \ W? \ S * в регулярном выражении, чтобы немного подтянуть его. Я не думал о регулярном выражении с точки зрения, скажем, проверки ввода пользователя в форме при написании, но это изменение позволяет использовать регулярное выражение для этой цели.

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

Это простой шаблон регулярного выражения для филиппинских номеров мобильных телефонов:

((\+[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


Я нашел, что это работает достаточно хорошо:

^\(*\+*[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


Я ответил на этот вопрос другим вопросом SO, прежде чем принять решение включить мой ответ в качестве ответа в этом потоке, потому что никто не обращался к тому, как требовать / не требовать элементов, просто выставляя регулярные выражения: Regex работает неправильно, сопоставляя неожиданные вещи

Из моего сообщения на этом сайте я создал краткое руководство, чтобы помочь кому-либо создать собственное регулярное выражение для собственного формата номера телефона, о котором я буду предупреждать (например, на другом сайте), что если вы слишком ограничительны, вы не можете получить желаемые результаты, и нет решения «одного размера подходит всем» для принятия всех возможных телефонных номеров в мире - только то, что вы решите принять в качестве вашего формата выбора. Используйте на свой риск.

Быстрый лист обмана

  • Начните выражение: /^
  • Если вы хотите потребовать пробел, используйте: [\s] или \s
  • Если вы хотите потребовать скобки, используйте: [(] и [)] . Использование \( и \) является уродливым и может сбить с толку.
  • Если вы хотите, чтобы что-то было необязательным, поставьте ? после этого
  • Если вы хотите дефис, просто введите - или [-] . Если вы не ставите его первым или последним рядом других персонажей, вам может потребоваться его избежать: \-
  • Если вы хотите принять разные варианты в слоте, поставьте скобки вокруг опций: [-.\s] потребует дефис, период или пробел. Значок вопроса после последней скобки сделает все из них необязательными для этого слота.
  • \d{3} : Требуется 3-значное число: 000-999. Сокращение для [0-9][0-9][0-9] .
  • [2-9] : для этого слота требуется цифра 2-9.
  • (\+|1\s)? : Примите «плюс» или 1 и пробел (символ трубы, | , is »или«) и сделайте его необязательным. Знак «плюс» должен быть экранирован.
  • Если вы хотите, чтобы определенные числа соответствовали слоту, введите их: [246] потребует 2, 4 или 6. [77|78] потребует 77 или 78.
  • $/ : Завершить выражение

Я работаю в компании, занимающейся исследованиями рынка, и мы должны фильтровать эти типы ввода в любое время. Вы слишком усложняете это. Просто разделите не-буквенно-цифровые символы и посмотрите, есть ли расширение.

Для дальнейшего анализа вы можете подписаться на одного из многих провайдеров, который предоставит вам доступ к базе данных действительных номеров, а также сообщит вам, являются ли они стационарными или мобильными телефонами, отключены и т. Д. Это стоит денег.


Я также предложил бы посмотреть библиотеку Google libphonenumber . Я знаю, что это не регулярное выражение, но оно делает именно то, что вы хотите.

Например, он признает, что:

15555555555

является возможным числом, но не действительным числом. Он также поддерживает страны за пределами США.

Основные функциональные возможности:

  • Разбор / форматирование / подтверждение номеров телефонов для всех стран / регионов мира.
  • 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 не является действительным австралийским номером

Регулярное выражение подходит для проверки формата номера телефона, но на самом деле не будет возможности проверить правильность номера телефона.

Я бы предложил пропустить простое регулярное выражение, чтобы протестировать ваш номер телефона, и использовать библиотеку, такую ​​как libphonenumber Google libphonenumber .

Представляем libphonenumber!

Используя один из ваших более сложных примеров, 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 для проверки и отображения номеров телефонов.


Для всех, кто заинтересован в том, чтобы что-то подобное с ирландскими номерами мобильных телефонов, вот простой способ его достижения:

http://ilovenicii.com/?p=87

PHP

<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

На этой ссылке есть решение JQuery.

РЕДАКТИРОВАТЬ:

Решение jQuery:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Source .


Вероятно, вам лучше использовать Masked Input для этого. Таким образом, пользователи могут ТОЛЬКО вводить цифры, и вы можете форматировать, как вы считаете нужным. Я не уверен, что это для веб-приложения, но если есть плагин jQuery с очень кликом, который предлагает некоторые варианты для этого.

http://digitalbush.com/projects/masked-input-plugin/

Они даже переходят к тому, как маскировать номера телефонов в своем учебнике.


Моя склонность заключается в том, чтобы согласиться с тем, что зачистка цифр и просто принятие того, что там лучше. Возможно, чтобы обеспечить хотя бы пару цифр, хотя это и запрещает что-то вроде алфавитного номера телефона «ASK-JAKE», например.

Пара простых выражений perl может быть:

@f = /(\d+)/g;
tr/0-9//dc;

Используйте первый, чтобы сохранить группы цифр вместе, что может дать ключи к форматированию. Используйте второй, чтобы тривиально подбросить все цифры.

Не волнуйтесь, что может потребоваться пауза, а затем ввести еще несколько клавиш? Или что-то вроде 555-1212 (дождитесь звукового сигнала) 123?


Сделайте замену на символах форматирования, затем проверьте оставшееся время действия телефона. В PHP,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

Ломать сложное регулярное выражение, подобное этому, может быть столь же эффективным, но гораздо более простым.


Я нашел это что-то интересное. Я не тестировал его, но похоже, что он будет работать

<?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.';
}
?>

    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

Должен заканчиваться цифрой, может начинаться с (или + или цифры, и может содержать + - (или)







phone-number