【问题标题】:PHP: How to validate a phone number if well formed?PHP:如果格式正确,如何验证电话号码?
【发布时间】:2009-10-13 17:28:15
【问题描述】:

使用 PHP,如何验证电话号码是否格式正确?

简单地去除所有非数字数据似乎最简单,只留下数字。然后检查是否存在 10 位数字。

这是最好和最简单的方法吗?

【问题讨论】:

  • 有些人不住在 +1 区:我的电话号码都以 +44 开头。国际号码不一定在国家/地区代码后正好有 10 位数字。当然,不想拨打国际电话有很多充分的理由 ;-)
  • 这是否假定您只是在寻找美国/加拿大的电话号码?一旦您使用国际前缀(德国为 +49)和/或特定国家/地区规则(例如,在德国,并非所有电话号码的长度都相同),事情就变得真的棘手了。

标签: php regex validation well-formed


【解决方案1】:

最好的?不。我在这种方法中看到的问题:

  • 某些区号 - 例如 000-###-#### - 无效。见http://en.wikipedia.org/wiki/List_of_NANP_area_codes
  • 某些交换 - 例如###-555-#### - 无效。见http://en.wikipedia.org/wiki/555_%28telephone_number%29
  • 有些人会在号码前输入 1,即 1-###-###-####。
  • 有些人只能通过分机访问,例如###-###-#### x####。
  • 有些公司会添加额外的数字,例如 1-800-GO-FLOWERS。电话系统会简单地忽略额外的数字,但用户可能希望能够输入整个数字。
  • 国际电话号码不一定是 10 位数字,即使您打折国家/地区代码。

够好吗?很有可能,但这取决于您和您的应用。

【讨论】:

  • 您建议如何确定用户输入的电话号码格式是否正确?
  • 取决于您需要的有效性级别。如果它是关键任务,我会有一个类似twilio.com 的系统尝试向该号码发起真正的电话呼叫。如果我没有将数据用于任何重要的事情,那么您的方法可能就足够了。这完全取决于应用程序。
  • 我建议你不要查电话号码。如果他们搞砸了,让用户处理后果。与流行的看法相反,人们不会经常在表单中搞砸,而且当他们这样做时,通常会在提交之前发现错误。
  • @Thomas Owens 如果您进行验证,也许只是一个警告 - “您的电话号码采用我们无法识别的格式,请仔细检查”。
  • 我可以接受。但是,除非我面前有一个有效输入/输出的正式定义,否则我会尽可能多地给用户设置输入格式的余地。如果我不尝试验证和清理所有内容,它通常会导致代码库更精简且更易于维护。
【解决方案2】:

您可以使用正则表达式:

$pattern_phone = "|^[0-9\+][0-9\s+\-]*$|i";
if(!preg_match($pattern_phone,$phone)){
    //Somethings wrong
}

尚未测试正则表达式,因此可能不是 100% 正确。

【讨论】:

  • 这取决于 OP 的要求。但我怀疑它是否 100% 正确。您的正则表达式将匹配 +0----------9 9 等字符串,仅举几个虚假数字。
【解决方案3】:

剥离后检查 10 位数字将检查语法但不会检查有效性。为此,您需要确定该地区/国家/地区有哪些有效数字可用,并可能编写一个正则表达式来匹配这些模式。

【讨论】:

【解决方案4】:

像这样验证/过滤数据的问题通常归结为以下问题的答案:“我想做到多严格?”然后演变成一系列“特征”问题

  • 您要接受国际号码吗?
  • 您要接受扩展吗?
  • 您是否要允许各种格式,即 (111) 222-3333 与 111.222.3333

根据您的业务规则,这些问题的答案可能会有所不同。但为了最灵活,我推荐 3 个字段来填写电话号码

  1. 国家代码(可选)
  2. 电话号码
  3. 扩展(可选)

所有 3 个字段都可以通过编程方式限制/仅过滤数值。然后,您可以在存储为某种可解析格式之前将它们组合起来,或者单独存储每个值。

【讨论】:

  • 剥离非数字字符将消除各种格式的问题。
【解决方案5】:

回答某件事是否是“最好的”事情几乎是不可能的(除非您是回答自己问题的人)。

您提出它的方式,剥离所有非数字,然后检查是否有 10 个数字,可能会导致字符串出现不需要的行为,例如:

乔治·华盛顿(1732 年 2 月 22 日 – 99 年 12 月 14 日)任指挥官 大陆军在 美国独立战争和服役 作为第一任美国总统 美利坚合众国。

因为剥离所有非数字将产生字符串2217321499,它有 10 个 fdigits 长,但我非常怀疑整个字符串是否应该被视为有效的电话号码。

【讨论】:

  • 剥离所有字符的一个更常见的问题是有人以###-###-#### x#### 之类的格式输入其扩展名。
【解决方案6】:

你需要什么格式?您可以对此使用正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多