Комплексное регулярное выражение для проверки номера телефона - PullRequest
874 голосов
/ 24 сентября 2008

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

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 12345678901

Я отвечу своей текущей попыткой, но я надеюсь, что у кого-то есть что-то лучше и / или более элегантно.

Ответы [ 39 ]

1 голос
/ 02 февраля 2017

Найти String regex = "^\\+(?:[0-9] ?){6,14}[0-9]$";

полезно для международных номеров.

1 голос
/ 18 апреля 2018

Поскольку в этом посте нет языкового тега, я приведу regex решение, используемое в python.

Само выражение:

1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+

При использовании в Python:

import re

phonelist ="1-234-567-8901,1-234-567-8901 1234,1-234-567-8901 1234,1 (234) 567-8901,1.234.567.8901,1/234/567/8901,12345678901"

phonenumber = '\n'.join([phone for phone in re.findall(r'1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+' ,phonelist)])
print(phonenumber)

Выход:

1-234-567-8901
1-234-567-8901 1234
1-234-567-8901 1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1 голос
/ 03 октября 2015

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

Вам лучше воспользоваться такой услугой, как numverify.com , они предлагают бесплатный JSON API для проверки международных телефонных номеров, плюс вы получите некоторые полезные Подробная информация о стране, местоположении, типе оператора и линии с каждым запросом.

1 голос
/ 24 сентября 2008

Можно ли иметь для отображения 4 отдельных поля (код города, 3-значный префикс, 4-значный номер, добавочный номер), чтобы они могли вводить каждую часть адреса отдельно, и вы можете проверить каждый фрагмент по отдельности? Таким образом, вы можете не только значительно упростить проверку, но и сохранить свои номера телефонов в более согласованном формате в базе данных.

1 голос
/ 24 августа 2012

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

Как и в верхнем ответе, уберите все уродства с номера телефона, чтобы у вас осталась строка числовых символов, с 'x', если предусмотрены расширения.

В Python:

Примечание: BAD_AREA_CODES взято из текстового файла , который вы можете найти в Интернете.

BAD_AREA_CODES = open('badareacodes.txt', 'r').read().split('\n')

def is_valid_phone(phone_number, country_code='US'):
    """for now, only US codes are handled"""
    if country_code:
        country_code = country_code.upper()

    #drop everything except 0-9 and 'x'
    phone_number = filter(lambda n: n.isdigit() or n == 'x', phone_number)

    ext = None
    check_ext = phone_number.split('x')
    if len(check_ext) > 1:
        #there's an extension. Check for errors.
        if len(check_ext) > 2:
            return False
        phone_number, ext = check_ext

    #we only accept 10 digit phone numbers.
    if len(phone_number) == 11 and phone_number[0] == '1':
        #international code
        phone_number = phone_number[1:]
    if len(phone_number) != 10:
        return False

    #area_code: XXXxxxxxxx 
    #head:      xxxXXXxxxx
    #tail:      xxxxxxXXXX
    area_code = phone_number[ :3]
    head      = phone_number[3:6]
    tail      = phone_number[6: ]

    if area_code in BAD_AREA_CODES:
        return False
    if head[0] == '1':
        return False
    if head[1:] == '11':
        return False

    #any other ideas?
    return True

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

1 голос
/ 20 апреля 2014

Рабочий пример для Турции, просто измените

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!';
}
0 голосов
/ 20 марта 2018

Попробуйте (это для индийской проверки мобильного номера):

if (!phoneNumber.matches("^[6-9]\\d{9}$")) {
  return false;
} else {
  return true;
}
0 голосов
/ 12 марта 2018

Примечание Он принимает в качестве ввода номер мобильного телефона США в любом формате и дополнительно принимает второй параметр - установите значение true, если хотите, чтобы формат выходного номера мобильного телефона выглядел красиво. Если указанный номер не является номером мобильного телефона, он просто возвращает false. Если мобильный номер обнаружен, он возвращает весь очищенный номер вместо true.

    function isValidMobile(num,format) {
        if (!format) format=false
        var m1 = /^(\W|^)[(]{0,1}\d{3}[)]{0,1}[.]{0,1}[\s-]{0,1}\d{3}[\s-]{0,1}[\s.]{0,1}\d{4}(\W|$)/
        if(!m1.test(num)) {
           return false
        }
        num = num.replace(/ /g,'').replace(/\./g,'').replace(/-/g,'').replace(/\(/g,'').replace(/\)/g,'').replace(/\[/g,'').replace(/\]/g,'').replace(/\+/g,'').replace(/\~/g,'').replace(/\{/g,'').replace(/\*/g,'').replace(/\}/g,'')
        if ((num.length < 10) || (num.length > 11) || (num.substring(0,1)=='0') || (num.substring(1,1)=='0') || ((num.length==10)&&(num.substring(0,1)=='1'))||((num.length==11)&&(num.substring(0,1)!='1'))) return false;
        num = (num.length == 11) ? num : ('1' + num);   
        if ((num.length == 11) && (num.substring(0,1) == "1")) {
            if (format===true) {
               return '(' + num.substr(1,3) + ') ' + num.substr(4,3) + '-' + num.substr(7,4)
            } else {
               return num
            }
        } else {
            return false;
        }
    }
0 голосов
/ 30 июня 2015
/\b(\d{3}[^\d]{0,2}\d{3}[^\d]{0,2}\d{4})\b/
...