【问题标题】:Validate U.S. Phone Numbers Only仅验证美国电话号码
【发布时间】:2014-09-26 20:50:43
【问题描述】:

我目前正在用 PHP 构建一个网站,用户将能够通过 SMS 消息进行交互。因此,我需要将他们的电话号码存储在我的数据库中。由于我现在只允许在美国进行 SMS 交互,因此我需要检查提交的电话号码是否符合美国格式。一般来说,这意味着几件事:1必须是第一个数字,区号不能以01开头,没有前导1的字符串必须是10位(3位区号加上 7 位数字)。

尽管有所有这些要求,但我希望用户可以随意以他们喜欢的任何格式输入他们的号码,而不会导致错误。

【问题讨论】:

    标签: php validation preg-replace preg-match phone-number


    【解决方案1】:

    忽略非数字是第一步。并非所有电话公司都需要前导 1,尤其是在新泽西附近。在那里拨号会导致错误或号码错误。

    区号不能是 [2-9]11 或 [2-9]9[0-9]。以 9 为中心数字的区号保留用于尚未确定的解决区号耗尽的方案。

    交换也不能以 0 或 1 开头,也不能是 [2-9]11。


    这些限制用以下代码表示:

    $mobile = preg_replace ('/\D/', '', $trimmed['mobile']);
    
    if ($mobile[0] == '1') $mobile = substr ($mobile, 1);  // remove prefix
    
    $invalid = strlen ($mobile) != 10  ||
               preg_match ('/^1/',      $mobile) ||  // ac start with 1
               preg_match ('/^.11/',    $mobile) ||  // telco services
               preg_match ('/^...1/',   $mobile) ||  // exchange start with 1
               preg_match ('/^....11/', $mobile) ||  // exchange services
               preg_match ('/^.9/',     $mobile);    // ac center digit 9
    

    【讨论】:

    • 这是一个有效的点。我对正则表达式不够好,无法编写有效的语句来排除[x]11 区号。如果你能做到这一点,我很乐意为你提供答案。
    • @David:我已经添加了代码来执行此操作,但请注意它识别无效数字;所有没有被标记为无效的东西都应该是有效的。
    • 我从未见过有人像你一样使用多个 preg_match 和 OR 语句。这是否比单个正则表达式更有效?
    • @David:就人类而言,它更高效:它准确地说明了它需要什么,易于理解和验证。如果有办法将它们组合成更少的匹配项,我不会立即看到它。
    【解决方案2】:

    在通过搜索和搜索了解了我所能做的之后,我找不到美国唯一的方法。所以,这是我设计的:

    首先,要允许任何输入格式,请使用preg_replace 删除所有非数字字符。 [用户可以使用他们想要的任何连字符或斜杠,但它们对我没有用。]

    $mobile = preg_replace('/\D/', '', $trimmed['mobile']);
    

    只需使用纯数字字符串,即可消除任何前导 1s — 这会处理用户包含前导 1 或区号以 1 开头的任何情况。 [如果有效,这应该总是给我留下一个10 数字字符串。]

    $mobiletrim = ltrim($mobile, '1');
    

    接下来,正则表达式检查修剪后的电话号码是否恰好是 10 数字长,并且不是以 01 开头。

        if (preg_match ('/^[2-9]\d{9}$/', $mobiletrim) || empty($trimmed['mobile'])) {
            $mp = TRUE;
            if (!empty($trimmed['mobile'])) { $mobiletrim = "1" . $mobiletrim; }
        } else {
            $profile_errors[] = "Please enter a valid U.S. phone number.";
        }
    if ($mp) { //Store Phone Number in db }
    

    您可以在上面看到的最后一步是在将有效号码存储在数据库中之前添加前导 1,前提是用户没有提交空的电话字段,如果他们没有,他们会这样做'不想存储他们的号码。


    从技术上讲,这将验证所有 NANP 号码。将其从 NANP 缩小到美国的唯一方法是通过解析当前美国区号列表来验证是否使用了美国区号。

    【讨论】:

    • @Sammitch,当您转到表单时,您可以选择同时回答它。这是 StackExchange 网站的一项功能,可在人们想要分享他们的知识但不存在合适的问题时使用。因为我根据 StackExchange 政策和设计分享了我的知识,所以投反对票根本没有意义。
    猜你喜欢
    • 2012-05-22
    • 2010-09-15
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2011-08-16
    • 2011-03-22
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多