我试图把一个全面的正则表达式放在一起来验证电话号码。理想情况下,它可以处理国际格式,但它必须处理美国格式,包括以下内容:

1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901

我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。


当前回答

    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

必须以数字结尾,可以以(或+或数字开头,并且可以包含+ -(或)

其他回答

执行替换格式化字符,然后检查剩余的电话有效性。在PHP中,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

打破像这样复杂的regexp同样有效,但要简单得多。

对这个话题的大量回复加强了我的直觉——这个问题实际上有无数个解决方案,没有一个是优雅的。

老实说,我建议你不要尝试验证电话号码。即使您可以编写一个允许所有不同合法格式的大型、复杂的验证器,它最终也会允许几乎任何东西,甚至在一开始就允许与电话号码相差甚远的东西。

在我看来,最优雅的解决方案是验证最小长度,仅此而已。

更好的选择……只要去掉输入中的所有非数字字符(除了“x”和前导的“+”符号),注意,因为英国人倾向于用非标准形式的+44(0)写数字……当要求使用国际前缀时(在这种特定情况下,应该完全丢弃(0))。

然后,你会得到这样的值:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

然后,当你显示,重新格式化为您的心脏内容。如。

  1 (234) 567-8901
  1 (234) 567-8901 x1234

如果可能的话,我建议有四个单独的字段——区域代码、3位前缀、4位部分、扩展名——这样用户就可以分别输入地址的每个部分,并且您可以分别验证每个部分。这样不仅可以简化验证,还可以将电话号码以更一致的格式存储在数据库中。

请注意,剥离()字符不适用于常见的英国号码的书写风格:+44(0)1234 567890,这意味着可以拨打国际号码: + 441234567890 或在英国拨打01234567890