正则表达式(RegEx)验证带国家码的手机号码

5
我需要一个PHP正则表达式,通过它我可以使用以下标准验证电话号码格式:
  • 只能包含数字;
  • 不能以零开头,因为我需要在国家代码前加上前缀;
  • 允许的国家代码列表应该在正则表达式中;
  • 国家代码后面的数字不能是零;
  • 号码的最大长度不应超过13位数字。
在发布这个问题之前,我尝试在Stack Overflow上搜索,但没有找到确切的解决方案。非常感谢任何帮助。
编辑:我只想让用户以有效的格式输入电话号码,因为目前我的客户在编写电话号码时会犯一些愚蠢的格式错误。我不担心它是否实际有效(可呼叫),因为用户会自己处理。
谢谢。
2个回答

5

我不想在这个问题上冒险。

仅凭电话号码的外观无法判断其是否有效,即使它“看起来”有效,它也可能不是您要找的电话号码(例如,其他人的电话号码)。

你试图在错误的层面解决问题。验证电话号码的唯一方法是实际打电话给它 ;)

一个符合你标准的正则表达式:

/^(1|20|21|..etc)[1-9][0-9]+$/

国家代码列表(用|分隔),后跟一个不为0的数字,然后是任意数量的数字。

你不能在一个正则表达式中同时进行13位长度检查和国家检查,因为国家代码的长度各不相同(至少据我所知)。 你可以通过通用的正则表达式来进行13位长度检查:

/^.{,13}$/

匹配长度最长为13个字符的任何内容


2
我赞同这个观点。楼主提出了好的、有效的想法,但是有很多方法可以提交一个无效的电话号码,即使通过任何模式检查,也不会有太大的意义。 - Pekka
我只希望用户以有效的格式输入电话号码。我不担心它是否实际有效,因为用户会自己处理。谢谢回复! :) - Saad
@Saad:这是我理解的一个例子。正则表达式:(\d{2,3})(\d{4})(\d{6}) 测试号码:911234567890 - AabinGunz
@Abhishek:这个表达式似乎不能按照我的期望工作。我希望这个表达式能够验证我在问题中提到的所有点。不过还是谢谢你关注这个问题 :) - Saad
我已经在我的帖子中添加了一个正则表达式。 - Halcyon

3

国家代码后面的数字不应为0;

该系统在意大利将失败。从国外拨打意大利电话号码时需要拨打前导0。

可能还有其他一些国家也是如此,但意大利是最知名的。

号码的最大长度不应超过13位数字。

对于较短的号码但添加了分机号的情况,这个规则会在多个国家中被打破。

使用3位国家代码、3位区号和8位用户号码,则会少一个数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接