PHP:如何验证电话号码,如果格式正确?
您可以使用正则表达式吧:
$pattern_phone = "|^[0-9\+][0-9\s+\-]*$|i";
if(!preg_match($pattern_phone,$phone)){
//Somethings wrong
}
没有测试正则表达式,所以它可能不是100%正确。
这取决于OP的要求。但我怀疑这是100%正确的。你的正则表达式会匹配像'+'或'0 ----------'或'9 9'这样的字符串,仅举几个假的数字。 – 2009-10-13 17:38:44
剥离后检查10位数将检查语法,但不检查有效性。为此,您需要确定该区域/国家/地区可用的有效数字,并可能编写一个正则表达式来匹配模式。
NANP http://en.wikipedia.org/wiki/North_American_Numbering_Plan指定美国和加拿大的有效号码。 – 2009-10-13 19:03:50
最好?我用这种方法看到的问题:
- 某些区号 - 例如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位数字。
够好吗?很可能,但这取决于你和你的应用程序。
作为一种确定用户输入电话号码的方式,您建议做什么? – JacobT 2009-10-13 17:34:35
取决于您需要的有效性水平。如果它的任务关键,我会有一个像http://www.twilio.com/这样的系统尝试发起一个真正的电话号码。如果我没有将这些数据用于任何重要的事情,那么您的方法就足够了。这一切都取决于应用程序。 – ceejayoz 2009-10-13 17:36:01
我建议你不要检查电话号码。如果他们搞砸了,让用户处理后果。与流行的观点相反,人们不会经常搞乱形式,而当他们这样做时,通常在提交之前就会发现他们的错误。 – 2009-10-13 17:36:44
像这样验证/过滤数据的问题通常归结为这个问题的答案:“我想成为多严格?”然后进入一系列“功能”问题
- 你打算接受国际号码吗?
- 你打算接受扩展吗?
- 你要允许不同的格式,即,(111)222-3333 VS 111.222.3333
根据业务规则,对这些问题的答案可能会有所不同。但是是最灵活的,我推荐3场拿电话号码
- 国家代码(可选)
- 电话号码
- 扩展(可选)
全部3场可编程限制/只为数字值过滤。然后,您可以将它们合并成一些可解析格式,或单独存储每个值。
剥离非数字字符将消除各种格式的问题。 – ceejayoz 2009-10-13 17:37:01
如果某件事情是“最好的”事情,那么回答几乎是不可能的(除非你是回答你自己的问题的人)。
你建议了,剥离所有非数字,然后检查是否有10位数字,可能会导致不必要的行为像一个字符串的方式:
乔治·华盛顿(1732年2月22日 - 月14,'99)是美国革命战争中的大陆军司令 并担任 作为美国的第一位总统 。
因为剥离所有非数字将导致该字符串2217321499
这是10个fdigits长,但我非常怀疑整个字符串应该被视为一个有效的电话号码。
剥离所有字符的更常见问题是某人以'### - ### - #### x ####''的格式输入其扩展名。 – ceejayoz 2009-10-13 17:38:12
有些人不住在+1区:我的电话号码全部开始+44。国际号码不必*在国家代码后有10位数字。当然,有很多不想打国际长途电话的好理由;-) – 2009-10-13 17:37:16
这是否假设您只查找美国/加拿大的电话号码?一旦你达到国际前缀(德国+49)和/或特定的国家规则(例如在德国,并不是所有的电话号码都具有相同的长度),事情就会变得非常棘手。 – Thorsten 2009-10-13 17:38:45
是的,仅限美国 – JacobT 2009-10-13 17:49:32