【问题标题】:regex to validate phone number正则表达式验证电话号码
【发布时间】:2014-11-05 11:19:00
【问题描述】:

帮我写一个符合以下条件的正则表达式

  1. 数字可以以+开头
  2. 数字可以包含 - 或 .但不是 () 和 /
  3. 数字可以从0开始
  4. 字符串中的最小数字应为 9 位,不包括分机详细信息和开头 +
  5. 电话号码字段中的最大数字不应超过 14,不包括 +
  6. 如果字符串包含 ex/ext/x,那么后面的数字不应超过 5 个字符(通常为 4 个)

上面的应该满足下面的例子

0-1234-123456
+91-1234-56789012
+91-1234-56789012 x1234
+91-1234-56789012 ex1234
+91-1234-56789012 ext12345
+91-1234-56789012x1234
+91-1234-56789012ex1234
+91-1234-56789012ext12345
91-1234-56789012
91-1234-56789012 x1234
91-1234-56789012 ex1234
91-1234-56789012 ext12345
91-1234-56789012x1234
91-1234-56789012ex1234
91-1234-56789012ext12345
91123456789012
91123456789012 x1234
91123456789012 ex1234
91123456789012 ext12345
91123456789012x1234
91123456789012ex1234
91123456789012ext12345
91.1234.56789012
91.1234.56789012 x1234
91.1234.56789012 ex1234
91.12345.6789012 ext12345
91.12345.6789012x1234
91.12345.6789012ex1234
91.12345.6789012ext12345
1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 234 567-8901
1.234.567.8901
12345678901

我在网上找到了几个链接,其中一个是 http://ericholmes.ca/php-phone-number-validation-revisited/

在stackoverflow上

A comprehensive regex for phone number validation

还有

^(?:(?:\+?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+))?$

不适用于上述许多情况

【问题讨论】:

  • 你说数字可以包含 - 或 .但不是 () 和 /。但是您的列表中有1 (234) 567-8901 的示例。这是一个错误吗?
  • 更新感谢 taemyr
  • 这是一个错误对不起泰米尔,我更新了我的错误

标签: php regex validation phone-number


【解决方案1】:
^\+?(\d[.\- ]*){9,14}(e?xt?\d{1,5})?$

解释;

  • ^ 断言字符串的开始
  • \+? 匹配可选加号
  • (\d[.\- ]*){9,14} 9 到 14 个单位数字,可能用空格、点或破折号分隔。
  • (e?xt?\d{1,5})? 可选的 x 可能前面有一个 e 或后面有一个 t。字母后面总是跟着 1 到 5 个数字。
  • $ 断言字符串结束

【讨论】:

  • @YellowandRed 好吧,我作弊了。在查看 GuyH 后,我更新了我的答案。 - 因为我最初是以一种相当愚蠢的方式写的。
  • 你更新的前一个对我不起作用,但 GuyH 解决了。现在它的 GuyH 不工作了。但我必须感谢他的努力。也谢谢你。
  • @YellowandRed 说明正则表达式是如何失败的,这样可以更容易地解决它。
  • 你否决了我的问题。对于任何不便,我深表歉意。如果你能投票支持,那会让我很高兴。
  • @Yellow and Red,我没有投反对票,我很高兴按原样回答。任何人都可以做到。他们可能看到了不一致之处(尤其是在括号中),认为它太混乱了。
【解决方案2】:

这会做到,但取决于您使用的编程语言(我们总是需要知道正则表达式,所以如果这对您不起作用,请回复使用的语言。我已经在 PHP5 中对其进行了测试.)

您的条件 5(电话号码中最多 14 个字符)似乎有误,因为如果您的几个示例包含点或连字符,则它们包含 16 个字符。无论如何,这不会检查整个事物的总长度,因为它会检查其他长度;它需要第二个正则表达式,或者更好的是,事先检查字符串长度(例如在 PHP 中通过调用 strlen)。

您可能希望在分机号码中留出空格,例如分机 1234;如果是这样,请在适当的位置添加 \s*。

我希望这会有所帮助。

^\+?\d[\d-\.\s]{8,15}\s?((ext|ex|x)\d{3,5})?$

【讨论】:

  • 规则 2 声明括号是非法的,编辑已将它们从列表中删除。
  • 条件 4 和 5 说明了位数的限制,而不是字符数。
  • 谢谢。还要感谢 Taemyr,提醒我圆括号已从您的示例中删除,并且条件 2 与最初所述相同。所以,黄色和红色,你可能想删除我说的 .....\(\)..... 的 4 个字符,所以它不允许使用括号。
  • 我现在编辑了答案以删除允许圆括号的位
  • 这个正则表达式有问题!!测试这个号码:0--------,, regex101.com/r/bL5yG7/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2014-06-25
  • 2012-02-13
  • 1970-01-01
  • 2016-12-23
  • 2016-12-09
相关资源
最近更新 更多