Лучшая практика для анализа и проверки номера мобильного телефона - PullRequest
7 голосов
/ 30 декабря 2010

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

В настоящее время мы очень прощаем, когда пользователь вводит число в форму, они могут вводить такие вещи, как "+44 123 4567890", "00441234567890", "0123456789", "+44 (0) 123456789", "012-345-6789 "или даже" у меня нет телефона ".

Однако для отправки текста формат должен быть 44хххххххххх (это только для мобильных телефонов Великобритании), поэтому нам нужно проанализировать его и проверить его передмы можем отправить.Ниже приведен код, который у меня есть на данный момент (C #, asp.net), было бы замечательно, если бы у кого-нибудь были идеи, как его улучшить.

Спасибо,

Annelie

private bool IsMobileNumberValid(string mobileNumber)
    {
        // parse the number
        _mobileNumber = ParsedMobileNumber(mobileNumber);

        // check if it's the right length
        if (_mobileNumber.Length != 12)
        {
            return false;
        }

        // check if it contains non-numeric characters
        if(!Regex.IsMatch(_mobileNumber, @"^[-+]?[0-9]*\.?[0-9]+$"))
        {
            return false;
        }

        return true;
    }

    private string ParsedMobileNumber(string number)
    {
        number = number.Replace("+", "");
        number = number.Replace(".", "");
        number = number.Replace(" ", "");
        number = number.Replace("-", "");
        number = number.Replace("/", "");
        number = number.Replace("(", "");
        number = number.Replace(")", "");

        number = number.Trim(new char[] { '0' });

        if (!number.StartsWith("44"))
        {
            number = "44" + number;
        }

        return number;
    }

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

Вот что я закончил:

private bool IsMobileNumberValid(string mobileNumber)
    {
        // remove all non-numeric characters
        _mobileNumber = CleanNumber(mobileNumber);

        // trim any leading zeros
        _mobileNumber = _mobileNumber.TrimStart(new char[] { '0' });

        // check for this in case they've entered 44 (0)xxxxxxxxx or similar
        if (_mobileNumber.StartsWith("440"))
        {
            _mobileNumber = _mobileNumber.Remove(2, 1);
        }

        // add country code if they haven't entered it
        if (!_mobileNumber.StartsWith("44"))
        {
            _mobileNumber = "44" + _mobileNumber;
        }

        // check if it's the right length
        if (_mobileNumber.Length != 12)
        {
            return false;
        }

        return true;
    }

    private string CleanNumber(string phone)
    {
        Regex digitsOnly = new Regex(@"[^\d]");
        return digitsOnly.Replace(phone, "");
    }

Ответы [ 4 ]

2 голосов
/ 30 декабря 2010

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

string CleanPhone(string phone)
{
    Regex digitsOnly = new Regex(@"[^\d]");   
    return digitsOnly.Replace(phone, "");
}

В качестве альтернативы, я бы порекомендовал вам использовать замаскированное текстовое поле для сбора # (доступно много вариантов), чтобы разрешить только числовой ввод, и отображать ввод в любом формате, который вы пожелаете. Таким образом, вы гарантируете, что полученное значение будет содержать все числовые символы.

1 голос
/ 30 декабря 2010

Проверьте QAS, это коммерческое решение.

У них есть адреса электронной почты, телефона и адреса.

http://www.qas.com/phone-number-validation-web-service.htm

Мы используем их услуги для адреса и электронной почты (не телефона) и были удовлетворены им.

0 голосов
/ 30 декабря 2010
public class PhoneNumber
{
    public PhoneNumber(string value)
    {
        if (String.IsNullOrEmpty(value))
            throw new ArgumentNullException("numberString", Properties.Resources.PhoneNumberIsNullOrEmpty);

        var match = new Regex(@"\+(\w+) \((\w+)\) (\w+)", RegexOptions.Compiled).Match(value);
        if (match.Success)
        {
            ushort countryCode = 0;
            ushort localCode = 0;
            int number = 0;

            if (UInt16.TryParse(match.Result("$1"), out countryCode) &&
                UInt16.TryParse(match.Result("$2"), out localCode) &&
                Int32.TryParse(match.Result("$3"), out number))
            {
                this.CountryCode = countryCode;
                this.LocalCode = localCode;
                this.Number = number;
            }
        }
        else
        {
            throw new ArgumentNullException("numberString", Properties.Resources.PhoneNumberInvalid);
        }
    }

    public PhoneNumber(int countryCode, int localCode, int number)
    {
        if (countryCode == 0)
            throw new ArgumentOutOfRangeException("countryCode", Properties.Resources.PhoneNumberIsNullOrEmpty);
        else if (localCode == 0)
            throw new ArgumentOutOfRangeException("localCode", Properties.Resources.PhoneNumberIsNullOrEmpty);
        else if (number == 0)
            throw new ArgumentOutOfRangeException("number", Properties.Resources.PhoneNumberIsNullOrEmpty);

        this.CountryCode = countryCode;
        this.LocalCode = localCode;
        this.Number = number;
    }

    public int CountryCode { get; set; }

    public int LocalCode { get; set; }

    public int Number { get; set; }

    public override string ToString()
    {
        return String.Format(System.Globalization.CultureInfo.CurrentCulture, "+{0} ({1}) {2}", CountryCode, LocalCode, Number);
    }

    public static bool Validate(string value)
    {
        return new Regex(@"\+\w+ \(\w+\) \w+", RegexOptions.Compiled).IsMatch(value);
    }

    public static bool Validate(string countryCode, string localCode, string number, out PhoneNumber phoneNumber)
    {
        var valid = false;
        phoneNumber = null;
        try
        {
            ushort uCountryCode = 0;
            ushort uLocalCode = 0;
            int iNumber = 0;

            // match only if all three numbers have been parsed successfully
            valid = UInt16.TryParse(countryCode, out uCountryCode) &&
                    UInt16.TryParse(localCode, out uLocalCode) &&
                    Int32.TryParse(number, out iNumber);

            if (valid)
                phoneNumber = new PhoneNumber(uCountryCode, uLocalCode, iNumber);
        }
        catch (ArgumentException)
        {
            // still not match
        }
        return valid;
    }
}
0 голосов
/ 30 декабря 2010

@ annelie, может быть, вы можете обновить свое регулярное выражение до более мощного. Проверьте этот сайт здесь . Он содержит много выражений, но я думаю, что одно из двух лучших выражений на сайте должно подойти вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...