协慌网

登录 贡献 社区

用于电话号码验证的全面正则表达式

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

  • 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

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

答案

更好的选择...... 只需在输入中删除所有非数字字符(除了'x' 和前导 '+' 符号),因为英国倾向于以非标准形式+44 (0) ...写数字,所以要小心+44 (0) ...当记者问到使用国际长途码(在特定情况下,应该丢弃(0)完全)。

然后,您最终得到如下值:

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

然后当您显示时,重新格式化您的心灵内容。例如

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

事实证明,至少在北美,有一种称为NANP的规范。

您需要准确指定所需内容。什么是合法分隔符?空格,破折号和句号?不允许分隔符?可以混合分隔符(例如,+ 0.111-222.3333)吗?如何处理扩展(例如,111-222-3333 x 44444)?特殊号码怎么样,比如 911?区号是可选的还是必需的?

这是一个 7 位或 10 位数的正则表达式,允许扩展,分隔符是空格,短划线或句点:

^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
.*

如果用户想要给你他的电话号码,那么请相信他是正确的。如果他不想给你,然后强迫他输入一个有效的号码将把他送到竞争对手的网站或让他输入一个适合你的正则表达式的随机字符串。我甚至可能想要查看优质性别性别的数量,然后输入。

我还会将以下任何内容视为网站上的有效条目:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"