PHP 正则表达式
概述
正则表达式(Regular Expression)是一种字符匹配工具,通过构建具有特定规则的模式,和输入字符串数据进行比较,然后进行匹配、分割、替换等等的相关操作。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了。
目前有两种不同规范的正则表达式:
- POSIX 规范:在兼容 POSIX 的 UNIX 系统上,grep 和 egrep 之类的工具都遵循 POSIX 规范,一些数据库系统中的正则表达式也匹配 POSIX 规范。
- PCRE 规范:为 Perl Compatible Regular Expressions 的缩写,中文即 Perl 兼容正则表达式,由 Philip Hazel 开发的 Perl 库,为很多现代工具所使用,大多数编程语言的正则表达式也都是集成该规范。
针对两种不同的正则表达式规范,PHP 提供了两组不同的函数库,分别为 POSIX Regex 扩展库 和 PCRE 扩展库,每一个函数库对应于一种特定的正则表达式。
需要注意的是,从PHP5.3.0
开始,POSIX Regex 扩展将被废弃,所有调用本扩展中函数都将提示E_DEPRECATED
错误。
接下来本文会对 PCRE 规范的正则表达式作出详细介绍。
PCRE 正则语法
1. 分隔符
当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以使任意非字母数字、非反斜线、非空白字符。一般是使用斜线 /
作为定界符。
如果分隔符需要在模式内进行匹配,它必须使用反斜线进行转义。如果分隔符经常在 模式内出现, 一个更好的选择就是是用其他分隔符来提高可读性。
2. 原子
原子是正则表达式的最基本的组成单位,而且必须至少包含一个原子。常见的有:
. 匹配除换行符之外任意字符
\d 匹配任意一个十进制数字
\D 匹配任意一个非十进制字符
\s 匹配一个不可见原子
\S 匹配一个可见原子
\w 匹配任意一个数字、字母或下划线,同 `[a-zA-Z0-9_]`
\W 匹配任意非一个数字、字母或下划线,同`[^a-zA-Z0-9_]`
[] 作为一个原子,匹配 [] 之间的一个原子
[^] 作为一个原子,不能匹配 [] 之间的一个原子
PCRE 中有关原子和元字符的完整列表,请见 正则表达式。
3. 元字符
元字符用来修饰原子的字符,不可以单独出现。
//量词
{n} 匹配原子恰好出现n次
{n,} 匹配原子出现不少于n次
{n,m} 匹配原子出现至少n次,最多m次
* 表示其前面的原子出现0至多次,相当于{0,}
+ 表示前面的原子至少出现1次,相当于{1,}
? 表示前面的原子出 0次或1次,相当于{0,1}
//边界限制
^ 指定匹配的字符串以什么原子开头
$ 指定匹配的字符串以什么原子结尾
//模式选择符
| 多选一
//模式单元
() 多原子作为一个大原子
4. 模式修正符
位于整个模式的最后面,在整个正则表达式中优先调用,是对正则表达式功能的扩展。可以一次使用一个,每一个都具有一定的意义,也可以连续使用多个符号。
i //不区分大小写
s //正则表达式中.匹配所有字符,包括换行符
U //匹配模式变为懒惰模式
x //空白忽略
PCRE 函数
函数名 | 说明 |
---|---|
preg_filter | 执行一个正则表达式搜索和替换 |
preg_grep | 返回匹配模式的数组条目 |
preg_last_error | 返回最后一个PCRE正则执行产生的错误代码 |
preg_match_all | 执行一个全局正则表达式匹配 |
preg_match | 执行匹配正则表达式 |
preg_quote | 转义正则表达式字符 |
preg_replace_callback_array | 执行正则表达式搜索并使用回调进行替换 |
preg_replace_callback | 执行一个正则表达式搜索并且使用一个回调进行替换 |
preg_replace | 执行一个正则表达式的搜索和替换 |
preg_split | 通过一个正则表达式分隔字符串 |
// 匹配
$qq = '10001110@qq.com';
$pattern = "/^[1-9][0-9]{4,}$/";
if (preg_match($pattern, $email, $match)) {
echo '匹配成功<hr />';
} else {
echo '匹配失败<hr />';
}
// 切割
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords); # Array ( [0] => hypertext [1] => language [2] => programming )
// 替换
$str = 'foo o';
echo preg_replace('/\s\s+/', ' ', $str); # 'foo o'
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count); # xp***to
echo $count; # 3
常用正则表达式
- 非空字符
$pattern = '/\\S+/';
- 手机号匹配
$pattern = '/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$/';
//匹配移动
$pattern = '^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$';
//匹配联通
$pattern = '^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$';
//匹配电信
$pattern = '^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$';
- E-mail 匹配
$pattern = '/^(\w)+(\.\w+)*@(\w)+(\.\w+)+$/';
- URL 匹配
$pattern = '/^https?\:////(\w+\.)+[a-z]+$/';
- IP 地址匹配
$pattern = '/((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/';
- 身份证号匹配
$pattern = '/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/';
- 中国邮政编码匹配
$pattern = '/^[1-9]\d{5}(?!\d)$/';
- HTML 标签匹配
$pattern = '/^<([a-z]+)([^<]+)(?:>(.)<\/\1>|\s+\/>)$/';
- 中文匹配
$pattern = '/^[\x{4e00}-\x{9fa5}]+$/u';
注:PHP 中使用 \x
表示十六进制数据。
- 日期匹配
$pattern1 = '/^\d{4}-\d{1,2}-\d{1,2}$/'; # 2018-04-27
$pattern2 = '/^(0?[1-9]|1[0-2])$/'; # 月份(01~09和1~12)
$pattern3 = '/^((0?[1-9])|((1|2)[0-9])|30|31)$/'; # 日期(01~09和1~31)
以上内容整理自网络,参考文章:
PHP 学习总结
研读官网文档和网络优秀个人文章,对 PHP 编程相关作出学习总结。
推荐阅读
PHP 微服务集群搭建
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务...
Jochen赞 112阅读 14.2k评论 6
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。
王中阳Go赞 11阅读 2.7k评论 4
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...
王中阳Go赞 6阅读 2.9k评论 4
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。
TANKING赞 7阅读 11.7k评论 5
Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。
huangzhhui赞 4阅读 1.5k评论 1
微信公众号开发:自动回复文本/图片/图文消息/关键词回复/上传素材/自定义菜单
对接流程1、申请微信公众号测试账号URL:[链接]2、登录,配置开发者服务器URL和Token开发者服务器配置代码:config.php {代码...} URL是config.php在你服务器的URLToken是上面代码自己设置的Token搞定之后,就能完...
TANKING赞 2阅读 10.5k
Ajax实现搜索联想 搜索关键词提醒 无刷新搜索
通过javascript监听搜索框的内容,调用后端即可。(1)javascript监听搜索框的内容(2)把搜索框的关键词传给后端进行搜索(3)搜索到结果,遍历到页面
TANKING赞 1阅读 4.6k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。