php 正则达达示中的模式修正符
我们通过元字符和原子完成了正则表达示的入门。有一些特殊情况我们依然需要来处理。深圳dd马达
如果abc在第二行的开始处如何匹配?
我不希望正则表达示特别贪婪的匹配全部,只匹配一部份怎么办?
这个时候,我们就需要用到下面的这些模式匹配来增强正则的功能。
常用的模式匹配符有:
| 模式匹配符 | 功能 |
|---|---|
| i | 模式中的字符将同时匹配大小写字母. |
| m | 字符串视为多行 |
| s | 将字符串视为单行,换行符作为普通字符. |
| x | 将模式中的空白忽略. |
| A | 强制仅从目标字符串的开头开始匹配. |
| D | 模式中的美元元字符仅匹配目标字符串的结尾. |
| U | 匹配最近的字符串. |
模式匹配符的用法如下:
/ 正则表达示/模式匹配符
模式匹配符是放在这句话的最后的。例如:
/\w+/s
格式我们清楚了,接下来最主要的是加强对于模式匹配符使用的理解和记忆。我们通过代码来理解加上和不加模式匹配符有何区别。
i 不区分大小写
<?php //在后面加上了一个i
$pattern = '/ABC/i';
$string = '8988abc12313';
$string1 = '11111ABC2222';
if(preg_match($pattern, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches); }else{
echo '没有匹配到';
}
?>
结论,不论是$string还是$string1全都匹配成功了。因此,在后面加上了i之后,能够不共分匹配内容的大小写。
m 视为多行
正则在匹配的时候,要匹配的目标字符串我们通常视为一行。
“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束。
当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。
注意:如果要匹配的字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
我们通过实验和代码来验证一下这个特点:
第一次匹配,你会发现匹配不成功:
<?php
$pattern = '/^a\d+/';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
第二次匹配,我们加上m 试试:
<?php
$pattern = '/^a\d+/m';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
结果:

哦耶!匹配成功了。/^a\d+/ 匹配的内容是a9,必须得在行开始处。在第二行也被匹配成功了。
s 识为一行
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。
第一次,不加模式匹配符s:
<?php $pattern = '/新的未来.+\d+/'; $string = '新的未来
987654321'; if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
} ?>
第二次,在正则表达示后面加上模式匹配符s:
<?php $pattern = '/新的未来.+\d+/s'; $string = "新的未来
987654321"; if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
} ?>
结果如下,匹配成功!

结论:
1.因为在新的未来,未来后面有一个换行
2.而.(点)是匹配非空白字符以外的所有字符。因此,第一次不成功
3.第二次,加上了s模式匹配符。因为,加上后.(点)能匹配所有字符。
x 忽略空白字符
1.如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
2.未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。
我们先来实验一下忽略空白行等特性:
<?php
$pattern = '/a b c /x';
$string = '学英语要从abc开始';
if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
}
?>
这样也能匹配成功。

在$pattern里面有空格,每个abc后面有一个空格。而$string里面没有空格。
所以x忽略空白字符。
而第二句话从字面上比较难理解,
<?php
//重点观察这一行
$pattern = '/a b c #我来写一个注释
/x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) {
echo '匹配到了,结果为:';
var_dump($matches);
} else {
echo '没有匹配到';
} ?>
结果也匹配成功了!

我们发现,x的第二个特性是忽略:#字符和下一个换行符之间的字符也被忽略。
e 将匹配项找出来,进行替换
e模式也叫逆向引用。主要的功能是将正则表达式括号里的内容取出来,放到替换项里面替换原字符串。
使用这个模式匹配符前必须要使用到preg_replace()。
mixed preg_replace ( mixed $正则匹配项 , mixed $替换项 , mixed $查找字符串)
preg_replace的功能:使用$正则匹配项变,找到$查找字符串变量。然后用$替换项变量进行替换。
在正式讲解前我们回顾一下之前的知识,我们故意的把每个要匹配的原子外面都加上括号:
<?php
//加上了括号
$pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match); } else {
echo '没有匹配到';
}
?>
我们来看看结果:

这是我们之前讲括号的时候:匹配到的内容外面有括号。会把括号里面的内容,也放到数组的元素里面。如图中的:987、abc、321。
我们接下来看正则表达示中的e模式:
<?php
$string = "{April 15, 2003}"; //'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i"; $replacement = "\$2"; //字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string); ?>
我们看看执行结果:

结论:
上例中\$2 指向的是正则表达示的第一个(\d+)。相当于把15又取出来了
替换的时候,我写上\$2。将匹配项取出来,用来再次替换匹配的结果。
U 贪婪模式控制
正则表达式默认是贪婪的,也就是尽可能的最大限度匹配。
我们来看看正则表达示是如何贪婪的:
<?php
$pattern = '/<div>.*<\/div>/'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
} ?>
我们来看看结果,得到如下结论。它从“
你好”直接匹配到了“我是
”。进行了最大范围的匹配。

同样一段代码我们再加大写的U,再看看效果:
<?php
$pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
} ?>

我们发现,只匹配出来了:
<div>你好</div>
这样,把正则的贪婪特性取消掉。让它找到了最近的匹配,就OK了。
A 从目标字符串的开头开始匹配
此模式类似于元字符中的^(抑扬符)效果。
<?php $pattern = '/this/A'; $string = 'hello this is a ';
//$string1 = 'this is a '; if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
} ?>
结论:
1.如果加A模式修正符的时候匹配不出来$string,不加时能匹配出来
2.如果加上了A模式修正符的时候能匹配出来$string1,因为必须要从开始处开始匹配
D 结束$符后不准有回车
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。
<?php
$pattern = '/\w+this$/';
$pattern1 = '/\w+this$/D';
$string = "hellothis ";
if (preg_match($pattern1, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
}else {
echo '没有匹配到';
}
?>
结论:
1.如pattern 在匹配$string的时候,$string的字符串this后有一个回车。在没有加D匹配符的时候也能匹配成功
2.如pattern 在匹配$string的时候,加上了D。$string的字符串this后有空格,匹配不成功。
php 正则达达示中的模式修正符的更多相关文章
- 正则表达式中常用的模式修正符有i、g、m、s、x、e详解
正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...
- 正则表达式模式修正符 比如/esi
正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...
- 正则表达式中模式修正符作用详解(i、g、m、s、x、e)
下面的转:http://www.cnblogs.com/shunyao8210/archive/2008/11/13/1332591.html 总结1:附件参数g的用法 表达式加上参数g之后,表明可以 ...
- PHP正则表达式模式修饰符详解
PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...
- QPS从0到4000请求每秒,谈达达后台架构演化之路
达达是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利用社会闲散人力资源,解决O2O最后三公里即时性配送难题(目前达达已经与京东到家合并). 达达业务主要包含 ...
- 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力
1.引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...
- QPS从0到4000请求每秒,谈达达后台架构演化之路(转载)
https://blog.csdn.net/czbing308722240/article/details/52350219 QPS从0到4000请求每秒,谈达达后台架构演化之路 达达是全国领先的 ...
- Go语言程序的状态监控 via 达达
Go语言程序的状态监控 Go是很实在的编程语言,从一开始就提供了很详细的运行状态信息.产品上线后的调优和排查疑难杂症都得靠这些状态信息.这边总结一些我们项目里用到的状态监控手段. pprof Go自带 ...
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
随机推荐
- java之mybatis整合spring
这篇讲解spring+mybatis的整合. 目录结构: 一. 整合spring的第一种方法 1. 新建 java 项目 : spring_mybatis 2.导入jar 包-----spring和m ...
- C# vb .net图像合成-合成星形
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- ASP.NET SignalR 系列(五)之群组推送
在上一章介绍了 一对一推送的方式,这章重点介绍下群组推送和多人推送 群组主要就是用到了方法:Groups.Add(Context.ConnectionId, groupName); 将不同的连接id加 ...
- 为什么UDP有时比TCP更有优势?
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP.1.网速的提升给UDP稳定性提供可靠网络保障 CDN服务商Akamai(NASDAQ: A ...
- JavaScript 的内置对象和浏览器对象
JavaScript 中对象通常包括两种类型:内置对象和浏览器对象,此外用户还可以自定义对象. 在 ECMAScript 中,更精确的定义应该分为:本地对象.内置对象和宿主对象. 对象包含两个要素: ...
- 2.熟悉LINUX的基本操作
cd命令:切换目录 (1)切换到目录 /usr/local cd /usr/local (2)去到目前的上层目录 cd .. (3)回到自己的主文件夹 cd ~ ls命令:查看文件与目录 (4)查看目 ...
- Html-元素类型笔记
注意点: 元素类型分为 块级元素 和 行内元素 块级元素: 在网页中以块的形式显示,默认情况都会占据一行,两个相邻的块级元素不会出现并列显示的元素,按照顺序自上而下排列. 块级元素可以定义自己的宽度和 ...
- tcp、udp协议栈
tcp struct tcphdr { __be16 source; //源端口 __be16 dest; //目的端口 __be32 seq; //序列号 __be32 ack_seq; //确认号 ...
- 理解 Node.js 中 Stream(流)
Stream(流) 是 Node.js 中处理流式数据的抽象接口. stream 模块用于构建实现了流接口的对象. Node.js 提供了多种流对象. 例如,对 HTTP 服务器的request请求和 ...
- Oracle 11g新特性direct path read引发的系统停运故障诊断处理
黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统输入用户名与密码后无法进入首页,表现为一直在运行等待,运行缓慢 (2)整个系统无法正常 ...