美国电话号码验证

时间:2008-10-06 18:10:09

标签: regex algorithm validation phone-number

我有一个网站表格,需要输入美国电话号码才能跟进,在这种情况下这是非常必要的。我想尝试消除用户输入垃圾数据 330-000-0000 。我已经看到了第三方的一些选项,可以为您验证电话号码,但是如果这是这种情况的最佳选择,那就是idk。但是,如果您已经使用过这些第三方中的一方,并且可以提出建议,这也将在此非常感激。

但是我正在考虑根据一系列规则检查数字,以便尝试缩小收到的垃圾电话号码。

  • 不是555号
  • 不包含7个相同的数字
  • 有效区号(这是现成的)
  • 不是123-1234或123-4567
  • 我想我也可以算出867-5309(嘿*

这是否会导致您认为不允许用户输入电话号码的任何情况?您能想到电话号码不应包含的任何其他规则吗?还有其他想法吗?

14 个答案:

答案 0 :(得分:9)

在我看来,你需要付出更多努力,而不是保证。考虑:

如果您的目的是防止错误输入的电话号码,那么只需一个非常简单的检查就可以捕获超过90%的电话号码。

如果你的目的是试图强迫用户提供有效数字,无论他们是否想要提供这些信息,那么你就已经完成了一项毫无希望的任务 - 即使你能够100%准确地获得,到第二个电信数据库验证输入的确切号码目前是否有效,你仍然无法保证他们给你的号码是他们自己的号码。再次,一个简单的检查将阻止大多数人进入虚假号码,但那些愿意尝试超过两三次的人将会找到一种方法来击败你的数字。< / p>

无论哪种方式,一个简单的测试都会让你获得良好的结果,进入更复杂的规则集将占用越来越多的时间,同时为你提供越来越少的好处(同时也可能增加误报,如已经显示的那样“七个相同的数字“和867-5309个案例。”

答案 1 :(得分:3)

您可以使用正则表达式在应用内部进行电话号码验证。根据您的语言,您可以调用一个函数,如果提供的电话号码与表达式匹配,则该函数将返回true。

在PHP中:

function phone_number_is_valid($phone) {
    return (eregi('^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$', $phone));
}

您可以在线查找不同的正则表达式。我在http://regexlib.com/DisplayPatterns.aspx?categoryId=7&cattabindex=2

找到了一个

编辑:正则表达式的某些语言特定网站:

答案 2 :(得分:2)

如果您可以验证区号,那么除非你真的,真的需要知道他们的电话号码,你可能会做到尽可能合理。

答案 3 :(得分:2)

Amybe看看this question的答案。

答案 4 :(得分:1)

867-5309是分配给不同区号的人的有效电话号码。

答案 5 :(得分:1)

您的客户仍然可以做我做的事情,即发出当地的电话号码。

此外,123-1234或123-4567只是无效数字,因为前缀以1开头,但234-5678或234-1234实际上是有效的(虽然它看起来是假的)。

答案 6 :(得分:1)

在Django中有一个名为localflavor的小型贡献包,它有很多国家特定的验证码,例如邮政编码或电话号码。您也可以查看源代码,了解django如何处理您想要使用的国家/地区;例如:US Form validation。对于您几乎不了解的国家/地区,这可能是一个很好的借口。

答案 7 :(得分:0)

如果您坚持使用美国和加拿大格式的数字,我认为以下正则表达式可能有效: [2-9] [0-9] [0-9] - [2-9] [0-9] [0-9] - [0-9] [0-9] [0-9] - [O- 9]&amp; ![2-9] [0-9] [0-9] -555- [0-9] [0-9] [0-9] [0-9]

答案 8 :(得分:0)

您还需要考虑现在在某些地区使用的十位拨号:这与长途拨号不同(即303-555-1234,而不是1-303-555-1234) )。在某些地方,有效的电话号码是十位数字;在其他人中,它是七。

答案 9 :(得分:0)

这些参数看起来对我很好,我也可以避免以911开头的数字只是为了安全。

答案 10 :(得分:0)

在我的研究中,我应该事先做过&gt;。&lt;我发现7个相同的数字是有效的电话号码。所以我可以指望这条规则。

答案 11 :(得分:0)

这是我使用的快速功能(如下)。我有权访问包含每月更新的areacode和前缀数据的zipcode数据库。我经常考虑进行数据倾斜以确认区号存在前缀。

    public static bool isPhone(string phoneNum)
    {
        Regex rxPhone1, rxPhone2;

        rxPhone1 = new Regex(@"^\d{10,}$");
        rxPhone2 = new Regex(@"(\d)\1\1\1\1\1\1\1\1\1");

        if(phoneNum.Trim() == string.Empty)
            return false;

        if(phoneNum.Length != 10)
            return false;

        //Check to make sure the phone number has at least 10 digits
        if (!rxPhone1.IsMatch(phoneNum))
            return false;

        //Check for repeating characters (ex. 9999999999)
        if (rxPhone2.IsMatch(phoneNum))
            return false;

        //Make sure first digit is not 1 or zero
        if(phoneNum.Substring(0,1) == "1" || phoneNum.Substring(0,1) == "0")
            return false;

        return true;

    }

答案 12 :(得分:0)

我不知道如果这是正确的地方,它是格式化功能而不是验证功能,我想让我们与社区分享,也许有一天它会有所帮助..

Private Sub OnNumberChanged()
    Dim sep = "-"
    Dim num As String = Number.ToCharArray.Where(Function(c) Char.IsDigit(c)) _
                                                 .ToArray
    Dim ext As String = Nothing
    If num.Length > 10 Then ext = num.Substring(10)
    ext = If(IsNullOrEmpty(ext), "", " x" & ext)
    _Number = Left(num, 3) & sep & Mid(num, 4, 3) & sep & Mid(num, 7, 4) & ext
End Sub

我的验证功能如下:

Public Shared Function ValidatePhoneNumber(ByVal number As String)
    Return number IsNot Nothing AndAlso number.ToCharArray. _
                                  Where(Function(c) Char.IsNumber(c)).Count >= 10
End Function

我将最后一个函数@实体的OnNumberChanging(number As String)方法称为。

答案 13 :(得分:0)

对于美国和国际电话验证,我发现此代码最合适:

((\+[1-9]{1,4}[ \-]*)|(\([0-9]{2,3}\)[ \-]*)|([0-9]{2,4})[ \-]*)*?[0-9]{3,4}?[ \-]*[0-9]{3,4}?$

你可以找到一个(虽然有些过时)讨论here