0

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

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

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

4

6 回答 6

2

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

  • 某些区号 - 例如 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 位数字。

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

于 2009-10-13T17:31:26.047 回答
0

您可以使用正则表达式:

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

没有测试正则表达式,所以它可能不是 100% 正确的。

于 2009-10-13T17:30:23.717 回答
0

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

于 2009-10-13T17:31:06.547 回答
0

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

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

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

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

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

于 2009-10-13T17:34:54.223 回答
0

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

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

乔治·华盛顿(George Washington,1732 年 2 月 22 日 - 99 年 12 月 14 日)是美国独立战争中大陆军的指挥官,并担任美利坚合众国第一任总统。

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

于 2009-10-13T17:36:28.987 回答
-2

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

于 2009-10-13T17:31:19.747 回答