【问题标题】:US Phone Number Verification美国电话号码验证
【发布时间】:2010-09-15 14:03:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 猜测(不是来自美国)您正在寻找美国电话号码的验证。如果您还需要国际号码验证,那就更复杂了。
  • 是的,我会做这个编辑谢谢

标签: regex algorithm validation phone-number


【解决方案1】:

也许看看this question的答案。

【讨论】:

  • 太棒了!没有出现在我的相关问题中。
【解决方案2】:

您可以在应用内部使用正则表达式进行电话号码验证。根据您的语言,您可以调用一个函数,如果提供的电话号码与表达式匹配,该函数将返回 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找到了上面的那个

编辑:一些特定语言的正则表达式站点:

【讨论】:

  • +1。感谢您提供指向电话号码的 C# reg 表达式的链接。非常适合我。
【解决方案3】:

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

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

您可以找到一个(尽管有些过时的)讨论 here

【讨论】:

    【解决方案4】:

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

    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) 方法。

    【讨论】:

      【解决方案5】:

      这是我使用的一个快速功能(如下)。我确实可以访问包含每月更新的区号和前缀数据的邮政编码数据库。我经常考虑做一个数据查询来确认区号的前缀是否存在。

          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;
      
          }
      

      【讨论】:

        【解决方案6】:

        在我看来,您为此付出的努力超出了预期。考虑:

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

        如果您的目的是试图强迫用户提供一个有效号码,无论他们是否愿意提供该信息,那么您就承担了一项无望的任务 - 即使您能够 100% 准确地访问,最多到第二个电信数据库来验证输入的确切号码当前是否有效,您仍然无法保证他们给您的号码是他们自己的号码。再一次,一个简单的检查将阻止大多数人输入虚假号码,但那些愿意尝试超过 2 或 3 次的人会找到一种方法来阻止你获取他们的号码的尝试。

        无论哪种方式,简单的测试都会为您带来良好的结果,而进入更复杂的规则集将占用越来越多的时间,而对您的好处却越来越少(同时还可能增加误报,如“ 7 个相同数字”和 867-5309 例)。

        【讨论】:

          【解决方案7】:

          您的客户仍然可以做我所做的事情,即提供当地的 moviefone 号码。

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

          【讨论】:

          • 不,最后 7 位数字中的第一个不能是 1
          【解决方案8】:

          在 Django 中有一个名为 localflavor 的不错的小贡献包,它有很多特定于国家/地区的验证码,例如邮政编码或电话号码。您也可以查看源代码,了解 django 如何为您想使用的国家/地区处理这些;例如:US Form validation。这对于您了解甚少的国家/地区的信息来说也是一个很好的途径。

          【讨论】:

            【解决方案9】:

            这些参数对我来说看起来不错,为了安全起见,我也可能避免使用以 911 开头的数字。

            【讨论】:

              【解决方案10】:

              如果您可以验证区号,那么除非您真的,真的需要知道他们的电话号码,否则您可能会尽其所能。

              【讨论】:

              • 显然,您还想验证 10 位数字,我认为这是不言而喻的。
              【解决方案11】:

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

              【讨论】:

              • 仅用于本地呼叫,即使是 7 我相信您可以使用完整的 10 位数字
              • 并非无处不在。在阿尔伯塔省(我住的地方),在切换到 10 位拨号之前,拨打所有 10 位会导致录音告诉您先拨“1”以进行长途电话,然后断开连接。
              【解决方案12】:

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

              【讨论】:

              • 任何允许以 911(或 411 开头)的数字可能都不是很好
              • 我相信还有其他 *11 数字可以做事。有关更多信息,请参阅en.wikipedia.org/wiki/N11_code,但我认为这取决于您所在的地区。不过,911 和 411 几乎遍布美国。
              【解决方案13】:

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

              【讨论】:

              • 如果您不喜欢您的号码(或从其他人那里购买)而未经电话公司干预,出售您的号码也是违法的。去年纽约有一个人在试图出售 867-5309 时被罚款 :)
              • 这将为我们的非美国读者和那些不记得 1980 年代的人解释这个笑话。 en.wikipedia.org/wiki/Jenny_(867-5309)
              • 抱歉——由于某种原因,链接解析不正确。无论如何,如果您不明白这个笑话,请查看维基百科。 :-)
              猜你喜欢
              • 2012-05-22
              • 1970-01-01
              • 1970-01-01
              • 2011-09-21
              • 2011-08-16
              • 2011-03-22
              • 1970-01-01
              • 2011-05-22
              • 2010-11-11
              相关资源
              最近更新 更多