7

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

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

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

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

4

13 回答 13

9

在我看来,你在这方面付出的努力超出了它的保证。考虑:

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

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

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

于 2008-10-06T20:50:19.160 回答
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找到了上面那个

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

于 2008-10-06T18:16:08.300 回答
1

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

于 2008-10-06T18:11:58.607 回答
1

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

于 2008-10-06T18:15:17.507 回答
1

也许看看这个问题的答案。

于 2008-10-06T18:18:06.957 回答
1

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

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

于 2008-10-06T18:18:39.607 回答
1

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

于 2008-10-06T18:22:58.413 回答
0

如果您只使用美国和加拿大格式的数字,我认为以下正则表达式可能有效:[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]

于 2008-10-06T18:13:33.173 回答
0

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

于 2008-10-06T18:14:35.480 回答
0

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

    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;

    }
于 2009-10-04T18:00:13.783 回答
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) 方法。

于 2009-10-29T06:03:18.513 回答
0

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

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

你可以在这里找到一个(尽管有些过时的)讨论。

于 2010-11-12T20:36:27.803 回答
-1

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

于 2008-10-06T18:17:36.113 回答