解析和验证手机号码的最佳做法

ann*_*lie 7 c# asp.net validation parsing

我想知道在发送文本之前解析和验证手机号码的最佳做法是什么.我已经有了可行的代码,但我想找到更好的方法(我的最后一个问题,这是我早期新年决议中编写质量更好的代码的一部分!).

当用户输入表格上的号码时,我们非常宽容,他们可以输入"+44 123 4567890","00441234567890","0123456789","+ 44(0)123456789","012-345"等内容. -6789"甚至"没有电话".

但是,要发送文本格式必须是44xxxxxxxxxx(这仅适用于英国手机),因此我们需要解析并验证它才能发送.下面是我现在的代码(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;
    }
Run Code Online (Sandbox Code Playgroud)

编辑

这是我最终得到的:

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, "");
    }
Run Code Online (Sandbox Code Playgroud)

Kei*_*ith 5

使用正则表达式删除任何非数字字符,而不是尝试猜测人们将如何输入数字 - 这将删除所有 Replace() 和 Trim() 方法,除非您确实需要修剪前导零。

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

或者,我建议您使用屏蔽文本框来收集 # (有许多可用选项)以仅允许数字输入,并以您想要的任何格式显示输入。这样您就可以保证收到的值都是数字字符。