PHP:如何验证电话号码,如果格式正确?

问题描述:

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

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

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

+2

有些人不住在+1区:我的电话号码全部开始+44。国际号码不必*在国家代码后有10位数字。当然,有很多不想打国际长途电话的好理由;-) – 2009-10-13 17:37:16

+0

这是否假设您只查找美国/加拿大的电话号码?一旦你达到国际前缀(德国+49)和/或特定的国家规则(例如在德国,并不是所有的电话号码都具有相同的长度),事情就会变得非常棘手。 – Thorsten 2009-10-13 17:38:45

+0

是的,仅限美国 – JacobT 2009-10-13 17:49:32

您可以使用正则表达式吧:

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

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

+1

这取决于OP的要求。但我怀疑这是100%正确的。你的正则表达式会匹配像'+'或'0 ----------'或'9 9'这样的字符串,仅举几个假的数字。 – 2009-10-13 17:38:44

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

+0

NANP http://en.wikipedia.org/wiki/North_American_Numbering_Plan指定美国和加拿大的有效号码。 – 2009-10-13 19:03:50

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

+0

对不起,我把这个问题解释错了。 – Cesar 2009-10-13 17:45:33

最好?我用这种方法看到的问题:

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

够好吗?很可能,但这取决于你和你的应用程序。

+0

作为一种确定用户输入电话号码的方式,您建议做什么? – JacobT 2009-10-13 17:34:35

+0

取决于您需要的有效性水平。如果它的任务关键,我会有一个像http://www.twilio.com/这样的系统尝试发起一个真正的电话号码。如果我没有将这些数据用于任何重要的事情,那么您的方法就足够了。这一切都取决于应用程序。 – ceejayoz 2009-10-13 17:36:01

+3

我建议你不要检查电话号码。如果他们搞砸了,让用户处理后果。与流行的观点相反,人们不会经常搞乱形式,而当他们这样做时,通常在提交之前就会发现他们的错误。 – 2009-10-13 17:36:44

像这样验证/过滤数据的问题通常归结为这个问题的答案:“我想成为多严格?”然后进入一系列“功能”问题

  • 你打算接受国际号码吗?
  • 你打算接受扩展吗?
  • 你要允许不同的格式,即,(111)222-3333 VS 111.222.3333

根据业务规则,对这些问题的答案可能会有所不同。但是是最灵活的,我推荐3场拿电话号码

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

全部3场可编程限制/只为数字值过滤。然后,您可以将它们合并成一些可解析格式,或单独存储每个值。

+1

剥离非数字字符将消除各种格式的问题。 – ceejayoz 2009-10-13 17:37:01

如果某件事情是“最好的”事情,那么回答几乎是不可能的(除非你是回答你自己的问题的人)。

你建议了,剥离所有非数字,然后检查是否有10位数字,可能会导致不必要的行为像一个字符串的方式:

乔治·华盛顿(1732年2月22日 - 月14,'99)是美国革命战争中的大陆军司令 并担任 作为美国的第一位总统 。

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

+0

剥离所有字符的更常见问题是某人以'### - ### - #### x ####''的格式输入其扩展名。 – ceejayoz 2009-10-13 17:38:12