由于某种特殊情况,前几天又重新开始写 PHP。这次遇到一个比较有意思的问题,被要求使用 PHP 脚本验证来自某个表单的一个(请注意,是一个)文本框中的数据是否为合法的国内电话号码格式或合法的国内移动电话号码格式。

我知道这样 BT 的需求不通过正则实现恐怕是南辕北辙。而我又一向不谙正则,尤其对排列组合十分感冒。无奈之下,搜索……

首先看到 phpchina 上某位兄台的博客上的文章,貌似对常用正则表达式做了一个清晰的整理。文章上对国内电话格式合法性的验证,给出了这样的公式:

\d{3}-\d{8}|\d{4}-\d{7} 很显然,它的适用范围不够广泛。

我们来重新分析一下需求:

1、合法的国内固定电话号码格式:带有前导零的长途区号、连字符“-”(念“hyphen”,具体可参考这里)、电话号码。除此之外,还应考虑分机号码的存在。

合法格式举例:

0571-88909090
0573-6262662
021-60606060-808

非法格式举例:

571-88909090
01060606060-808
0573-6262662#801
+86.75585858585
2、合法的国内移动电话号码格式:11 位数字。以 1 开头,第二位是 3 或者 5。

合法格式举例:

13012345678
13888888888
非法格式举例:

+86.13800571505
138-00571506
整理了思路,我们开始逐个消灭。首先是国内固定电话,其组成部分应为:

区号,一个前导零,跟 2 至 3 位数字:

0\d{2,3} 电话号码,7 至 8 位数字:

\d{7,8} 分机,3 位数字:

\d{3,} 用连字符连起来就是:

/^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/ 接着是国内移动电话,其组成部分应为:

前导“1”:

1 第二位,3 或 5:

[35] 剩余 9 位数字:

\d{9} 全部连起来就是:

/^1[35]\d{9}$/ 到这里为止,只要将两个匹配公式连起来就可以实现上述 BT 需求了。

以上纯属个人思路,纰漏之处在所难免,欢迎猛烈拍砖。

最后推荐一个收集常用的正则表达式的网站,请温柔地点击这里

标签: mobile, telphone, php, regular

已有 2 条评论

  1. 手机的应该是:/^1[35]\d{9}$/

  2. wiLdGoose wiLdGoose

    很感谢楼上朋友的帮助,已经修改过来了.

添加新评论