浅谈PHP正则表达式中修饰符/i, /is, /s, /isU


Posted in PHP onOctober 21, 2014

在学习PHP正则表达式修饰符之前先来理解下贪婪模式,前面在元字符中提到过"?"还有一个重要的作用,即"贪婪模式",什么是"贪婪模式"呢?

PHP正则表达式贪婪模式

比如我们要匹配以字母"a"开头字母"b"结尾的字符串,但是需要匹配的字符串在"a"后面含有很多个"b",比如"a bbbbbbbbbbbbbbbbb",那正则表达式是会匹配第一个"b"还是最后一个"b"呢?如果你使用了贪婪模式,那么会匹配到最后一个"b",反之只是匹配到第一个"b"。

PHP正则表达式贪婪模式使用实例

/a.+?b/  
/a.+b/U

对比不使用贪婪模式的实例如下:

/a.+b/ 

上面使用了一个修饰符U,详见关于修饰符的介绍。

PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢?
 
i 不区分大小写
 
s 模式中的圆点元字符(.)匹配所有的字符,包括换行符
 
x 模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两 头,也都被忽略
 
A (PCRE_ANCHORED) 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配即自动在模式开头加上^。
 
D (PCRE_DOLLAR_ENDONLY) 如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配 任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。  S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
 
U (PCRE_UNGREEDY) 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。
 
X (PCRE_EXTRA) 此 修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将 来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。即:贪婪模式,最 大限度匹配 如:/a[\w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce  u (PCRE_UTF8) 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。

PHP正则表达式修饰符的理解

在PHP正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E")。

PHP正则表达式修饰符的种类及介绍:

◆i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。

◆m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。

◆s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!

◆x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。

◆e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。

◆A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。

◆E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。

◆U:和问号的作用差不多,用于设置"贪婪模式"。

PHP正则表达式修饰符的相关内容就向你介绍到这里,希望对你了解和掌握PHP正则表达式修饰符有所帮助。

PHP 相关文章推荐
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
PHP SOCKET编程详解
May 22 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
php session_decode函数用法讲解
May 26 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 #PHP
php中的字符编码转换函数用法示例
Oct 20 #PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 #PHP
php的ZipArchive类用法实例
Oct 20 #PHP
php自定义apk安装包实例
Oct 20 #PHP
php防止站外远程提交表单的方法
Oct 20 #PHP
php获取textarea的值并处理回车换行的方法
Oct 20 #PHP
You might like
PHP 实现explort() 功能的详解
2013/06/20 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
python能做哪些生活有趣的事情
2020/09/09 Python
python help函数实例用法
2020/12/06 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
美的官方商城:Midea
2016/09/14 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
医院检讨书范文
2014/02/01 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
python代码实现备忘录案例讲解
2021/07/26 Python
python脚本框架webpy的url映射详解
2021/11/20 Python
Elasticsearch 数据类型及管理
2022/04/19 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技