0

0

php实战正则表达式(一):验证手机号

php中文网

php中文网

发布时间:2016-06-20 12:49:23

|

1759人浏览过

|

来源于php中文网

原创

本文通过逐步完善一个验证手机号的正则表达式来介绍了正则表达式中的字符组、量词、字符串起始/结束位置、分组、分组中的选择结构、反向引用、命名分组等概念。

1 基本验证

即验证字符串是否是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等。我们上一节得到的表达式对手机开头并没有进行验证。

AI大学堂
AI大学堂

科大讯飞打造的AI学习平台

下载

表达式

^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-?)\d{4}(?P=separato)\d{4}$

上面正则表达式中的(?P-?)就是命名分组。命名分组的形式是(?P...),命名分组的引用使用(?P=name)的形式。

5 总结

到此为止,一个健壮的验证手机号的正则表达式就完成了。虽然功能很简单,但是还是涉及到了正则表达式中不少的知识点。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号