php实战正则表达式:验证手机号
摘自http://www.tuicool.com/articles/MFNZRzu
本文通过逐步完善一个验证手机号的正则表达式来介绍了正则表达式中的 字符组 、量词 、 字符串起始/结束位置 、 分组 、 分组中的选择结构 、 反向引用 、 命名分组等概念。
1 基本验证
即验证字符串是否是11位数字。
表达式
[0123456789]{11}
或
[0-9]{11}
或
\d{11}
知识点
字符组:正则表达式中用方括号对 [...]
表示字符组。字符组表示在同一位置可能出现的字符。
如, [0123456789]
表示匹配数字0123456789中的任意一个; [0123abc]
匹配数字0123和字母abc中的任意一个。
字符组的范围表示法:字符组中使用短横线( [..-..]
)来表示一段范围的字符。
如, [a-z]
表示匹配所有小写英文字母中的任意一个; [a-zA-Z]
表示匹配所有小写英文字母和大写英文字母中的一个; [0-9]
表示匹配0123456789中的任意一个。
要注意的是,默认范围是起始字符的ACSⅡ码到结束字符的ACSⅡ码之间的字符。
字符组简记法:对于一些常用的字符组,正则表达式规定了一些简记符号来表示它们。
\d
所有的数字,即[0-9]
\D
所有的非数字,与\d
互斥\w
所有的单词字符(字符、数字、下划线),即[0-9a-zA-Z_]
\W
所有的非单词字符,与\W
互斥\s
所有的空白字符,包括空格、制表符、回车符、换行符等空白字符\S
所有的非空白字符,与\s
互斥
量词:量词表示它所修饰的对象(如字符、字符组)可能出现的次数。
量词的一般形式是 {m,n}
(逗号 ,
后面不能有空格),表示它所修饰的字符(或字符组)的出现次数大于等于m次,小于等于n次。特别地
{m}
表示修饰对象只能出现m次;{0,n}
表示修饰的对象最多出现n次,最少出现0次;{m,}
表示修饰的对象最少出现m次。
2 长度真的只能为11?
观察下面的gif中的代码可以看到,当输入的字符串是长度为15的数字时,也可以匹配前面11个数字。甚至输入字符是 abcd180123412341234
时也可以匹配到11个数字。
这是因为上面的正则表达式的含义是“匹配11个数字”,因此 只要 输入的字符串中 有连续的11个数字 就可以匹配成功。要想验证输入的字符串仅仅是手机号,需要使用正则表达式中的字符串起始位置 ^
和字符串结束位置 $
。
表达式
^\d{11}$
知识点
正则表达式中有一些符号匹配的是位置,而不是文本,这类符号叫做 锚点 (anchor)。 ^
、 $
就是其中两个。
^
匹配的位置是字符串的开始位置
$
匹配的位置是字符串的结束位置
3 更严谨的验证
我们都知道国内常见的手机号都是以130-139,150-153、155-159、180、182、185-189开头,此外,还有170、176-178等。我们上一节得到的表达式对手机开头并没有进行验证。
表达式
^1(3[0-9]|5[012356789]|8[0256789]|7[0678])\d{8}$
知识点
分组:正则表达式中可以用圆括号对 (...)
表示一个分组(子表达式),这样在匹配的结果中除了会返回全部匹配到的内容,还会返回每个子表达式各自匹配到的内容。如上图中的表达式执行后的结果,数组的第0个元素为整个正则表达式匹配到的值,第1个元素为圆括号对内的正则匹配到的值。
preg_match('/^1(3[0-9]|5[012356789]|8[0256789]|7[0678])\d{8}$/', '18012341234', $arr);
print_r($arr);
/*
Array
(
[0] => 18012341234
[1] => 80
)
*/
选择结构:圆括号对 (...)
内的子表达式用竖线 |
隔开表示不同的选择,圆括号内的整个正则可以匹配任意一个选择。
例如, (3[0-9]|5[012356789]|8[0256789]|7[0678])
表示这里匹配的值可以是 3[0-9]
或者 5[012356789]
或者 8[0256789]
或者 7[0678]
中的任意一个。
4 锦上添花
有些时候,手机号中间会有 -
符号,变成 180-1234-1234
的形式,比如现在的iPhone会自动将手机号转为这种格式。
依据到目前为止介绍的一些知识,可以写出下面的正则表达式来兼容 180-1234-1234
的形式:
^1(3[0-9]|5[012356789]|8[0256789]|7[0678])-{0,1}\d{4}-{0,1}\d{4}$
其中 -{0,1}
表示字符 -
可以出现1次或者不出现,这是我们前面了解过的量词,其实在正则表达式中,对这种 常用量词 还规定了特殊的记法:
?
相当于{0,1}
,可以出现0次或1次+
相当于{1,}
,出现次数大于等于1次*
相当于{0,}
,出现次数大于等于0次
因此,上面的正则表达式也等价于
^1(3[0-9]|5[012356789]|8[0256789]|7[0678])-?\d{4}-?\d{4}$
但是,上面的表达式除了能匹配 18012341234
和 180-1234-1234
,其实也能匹配 180-12341234
、 1801234-1234
这两种形式。
如果我们只想匹配 18012341234
和 180-1234-1234
这两种形式,可以使用正则表达式中的 反向引用:
^1(3[0-9]|5[012356789]|8[0256789]|7[0678])(-?)\d{4}\2\d{4}$
上面的 \2
就是反向引用,它是匹配第二个圆括号对 (...)
匹配到的内容。反向引用的形式是 \num
,它是在正则表达式里面引用前面的分组匹配到的内容。
上面的正则表达式中,我们用 \2
来进行反向引用,然而 \1
却没有什么用,那么我们可不可以忽略那些不用的分组呢?正则表达式中的 非捕获分组 可以满足这个需求:
^1(?:3[0-9]|5[012356789]|8[0256789]|7[0678])(-?)\d{4}\1\d{4}$
上面的 (?:3[0-9]|5[012356789]|8[0256789]|7[0678])
就是非捕获分组。非捕获的形式是 (?:...)
,使用了非捕获分组后,匹配的结果里面不再有该分组匹配到的结果。
上面对分组的引用是基于子表达式的编号,当正则表达式比较复杂或编号太多时要弄清楚每个分组的编号是一件很痛苦的事情。因此,正则表达式提供了 命名分组 :
^1(?:3[0-9]|5[012356789]|8[0256789]|7[0678])(?P<separato>-?)\d{4}(?P=separato)\d{4}$
上面正则表达式中的 (?P<separato>-?)
就是命名分组。命名分组的形式是 (?P<name>...)
,命名分组的引用使用 (?P=name)
的形式。
5 总结
到此为止,一个健壮的验证手机号的正则表达式就完成了。虽然功能很简单,但是还是涉及到了正则表达式中不少的知识点。
php实战正则表达式:验证手机号的更多相关文章
- Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号
最近项目中新增的功能,需要对手机号.姓名.身份证号等一些信息进行验证,最好的方法是通过正则表达式来验证,网上查了一些资料,写了这几个工具方法. 1.验证手机号 规则:第一位只能是1,第二位为3-8中的 ...
- JS正则表达式验证手机号和邮箱
一.验证手机号 function isPoneAvailable(poneInput) { var myreg=/^[1][3,4,5,7,8][0-9]{9}$/; if (!myreg.test( ...
- Android中利用正则表达式验证手机号是否合法
利用正则表达式来验证手机号是否合法,现在我们简单使用一下,这个在实际的应用中很实用. 例:在输入框中输入手机号,判断是否合法, MainActivity中: package com.example.m ...
- IOS开发——正则表达式验证手机号、密码
App的实际应用中,用户登陆功能基本是每个App都有需求的一个功能.而当前我们很常规的做法,就是让用户把手机号作为自己的用户名,而在注册获取短信验证码的过程中,我们首先要完成的一个步骤,就是校验用户的 ...
- Android使用正则表达式验证手机号
国内手机号代码段分配如下: 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156. ...
- JQuery使用正则表达式验证手机号,邮箱,身份证(含有港澳台),网址
自己对正则验证也没系统用过,这次自己做个demo,一下子把这些全都用上了,下次有需要直接来拿了. 以下代码是在页面使用JQuery进行验证的,也有在后台进行验证的,可以试试,都一样的原理. 直接上代码 ...
- js正则表达式 验证手机号,email地址和邮政编码
手机号码的验证(13开头和158,159开头,共11位) var re; var ss=document.getElementById('textbox3').value; ...
- [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)
数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChin ...
- JS正则表达式验证账号、手机号、电话和邮箱
JS正则表达式验证账号.手机号.电话和邮箱 效果体验:http://keleyi.com/keleyi/phtml/jstexiao/15.htm 验证帐号是否合法 验证规则:字母.数字.下划线组成, ...
随机推荐
- Redis菜鸟汇总
1.是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为 ...
- 【转】Gvim开发环境配置笔记--Windows篇
配置文件(vimrc) set nocompatible set nu! set cursorline colorscheme murphy " vim 自身命令行模式智能补全 set wi ...
- EmguCV 轮廓分析函数汇总
一.cvApproxPoly 使用多边形逼近一个轮廓,使得顶点数目变少.算法先从轮廓选择2个最远的点,然后将2个连成一个线段,然后再查找轮廓上到线段距离最远的点,添加到逼近后的新轮廓.算法反复迭代,不 ...
- 推荐《HeadFirst设计模式》
相对于国内初版的<大话设计模式>,HeadFirst真的是更好的选择,虽然看起来很厚.很吓人,但对于初学者而言浅显易懂.直击要点,即使对设计模式熟悉的同学去读这本书相信也有很大的收获.用了 ...
- 【转载】James Whittaker:经营成功的测试职业生涯
转注:这篇文章出自 James A. Whittaker ,但未找到原始出处/译者.如果有知道原始出处的朋友,可在评论这留言. 你是如何开始做测试工作的? 1989年,我在田纳西大学读研究生的时候, ...
- NSMutableAttributedString可变属性字符串的用法
适用于:当你想对一个字符串中的某几个字符更改颜色,字体... NSString *string = @"今日营养配餐提供热量1800千卡,需要饮食之外额外补充钙10mg,铁20mg,锌9.5 ...
- 【Android测试】【第十二节】Uiautomator——API详解
◆版权声明:本文出自carter_dream的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4921701.html 简单的例子 以一个 ...
- CodeMirror很好用
基于Javascript的web的文本编辑器 各种强大 支持多种语言的语法高亮, 多种主题 vim ,emacs 快捷键
- SQL-乐观锁,悲观锁之于并发
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...