解析PHP中的正则表达式以及模式匹配


Posted in PHP onJune 19, 2013

PHP中对于正则处理文本提供了两种方式,一种是PCRE方式(PCRE库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当前的实现对应于perl 5.005.);另一个是POSIX方式。

PCRE 函数库中的函数使用的模式语法非常类似perl. 表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母数字, 除反斜杠(\)和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4开始, 可以使用perl样式的(), {}, []以及<>作为分隔符. 更详细的解释参见模式语法.

结束分隔符后面可以紧跟模式修饰符来影响匹配效果. 参见模式修饰符.
PCRE的模式修正符
i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
x (PCRE_EXTENDED)
如果设置了这个修饰符, 模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略. 这个修饰符 等同于perl中的/x修饰符, 使被编译模式中可以包含注释. 注意: 这仅用于数据字符. 空白字符 还是不能在模式的特殊字符序列中出现, 比如序列(?(引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误. 比如( ?(就会导致错误.).
e (PREG_REPLACE_EVAL)
如果这个修饰符设置了, preg_replace()在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php代码评估之行(eval函数方式), 并使用之行结果 作为实际参与替换的字符串. 单引号, 双引号, 反斜线(\)和NULL字符在 后向引用替换时会被用反斜线转义.
仅preg_replace()使用此修饰符, 其他PCRE函数忽略此修饰符.
A (PCRE_ANCHORED)
如果设置了这个修饰符, 模式被强制为"锚定"模式, 也就是说约束匹配使其仅从 目标字符串的开始位置搜索. 这个效果同样可以使用适当的模式构造出来, 并且 这也是perl种实现这种模式的唯一途径.
D (PCRE_DOLLAR_ENDONLY)
如果这个修饰符被设置, 模式中的元字符美元符号仅仅匹配目标字符串的末尾. 如果这个修饰符 没有设置, 当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符). 如果设置了修饰符m, 这个修饰符被忽略. 在perl中没有与此修饰符等同的修饰符.
S
当一个模式需要多次使用的时候, 为了得到匹配速度的提升, 值得花费一些时间 对其进行一些额外的分析. 如果设置了这个修饰符, 这个额外的分析就会执行. 当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符).
U (PCRE_UNGREEDY)
这个修饰符逆转了量词的"贪婪"模式. 使量词默认为非贪婪的, 通过量词后紧跟? 的方式可以使其成为贪婪的. 这和perl是不兼容的. 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?).在非贪婪模式, 通常不能匹配超过 pcre.backtrack_limit 的字符.
X (PCRE_EXTRA)
这个修饰符打开了PCRE与perl不兼容的附件功能. 模式中的任意反斜线后就ingen一个 没有特殊含义的字符都会导致一个错误, 以此保留这些字符以保证向后兼容性. 默认 情况下, 在perl中, 反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文. 当前没有其他特性由这个修饰符控制.
J (PCRE_INFO_JCHANGED)
内部选项设置(?J)修改本地的PCRE_DUPNAMES选项. 允许子组重名. (译注:只能通过内部选项设置, 外部的/J设置会产生错误.)
u (PCRE8)
此修正符打开一个与perl不兼容的附加功能. 模式字符串被认为是utf-8的. 这个修饰符 从unix版php 4.1.0或更高, win32版php 4.2.3开始可用. php 4.3.5开始检查模式的utf-8合法性. This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

PHP 相关文章推荐
Windows PHP5和Apache的安装与配置
Jun 08 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 PHP
在laravel框架中使用model层的方法
Oct 08 PHP
PHP实现随机发放扑克牌
Apr 21 PHP
如何用PHP实现多线程编程
May 26 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 #PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 #PHP
具有时效性的php加密解密函数代码
Jun 19 #PHP
一个简单的php加密解密函数(动态加密)
Jun 19 #PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 #PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 #PHP
深入PHP数据加密详解
Jun 18 #PHP
You might like
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
django中media媒体路径设置的步骤
2019/11/15 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
汽修专业自荐信
2014/07/07 职场文书
起诉书范文
2015/05/20 职场文书
今日说法观后感
2015/06/08 职场文书
婚宴致辞
2015/07/28 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书