PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)


Posted in PHP onOctober 05, 2012

前面我们已经学习了正则表达式的基础语法,包括了定界符、原子、元字符和模式修正 符。实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数。本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,主要包含了分割, 匹配,查找,替换等等处理操作,依旧是配合示例讲解,让我们开始吧。

和正则表达式一样,正则表达式处理函数不能够独立使用,而这必须相结合,才能够完成特定的功能。在前面我们也说过,基于perl的正则表达式要快于POXIS正则表达式处理函数,所以我们只介绍以preg开头的基于perl的正则表达式。注意:在能偶使用字符串函数处理的时候,就不要使用正则表达式来处理字符串,因为字符串处理函数更快。

下面我们来看一些常用的正则表达式处理函数。

1,preg_match()函数。

函数preg_match()执行一个正则表达式匹配,其定义如下:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

实际上就是搜索subject中匹配pattern的部分, 以保存在数组matches中.请看示例:

<?php 
$pattern = '/<b>.*?<\/b>/'; 
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas'; 
if (preg_match($pattern, $string, $arr)) { 
echo "正则表达式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>"; 
print_r($arr); 
} else { 
echo "<font color='red'>正则表达式{$pattern}和字符串{$string}匹配失败</font>"; 
} 
?>

2,preg_match_all()函数。

函数preg_match_all()函数执行一个全局正则表达式匹配,其定义和preg_match()函数一致,只不过匹配了全部结果。请看示例:

<?php 
$pattern = '/<b>.*?<\/b>/'; 
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas'; 
if (preg_match_all($pattern, $string, $arr)) { 
echo "正则表达式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>"; 
print_r($arr); 
} else { 
echo "<font color='red'>正则表达式{$pattern}和字符串{$string}匹配失败</font>"; 
} 
?>

依旧是上面的示例(只换了正则处理函数为preg_match_all()),但是匹配的结果数组内容不一样了。

3, preg_replace()函数

函数preg_replace()执行一个正则表达式替换,其定义如下:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

实际上就是搜索subject中匹配pattern的部分, 以replacement进行替换.其中limit指的是每个模式在每个subject上进行替换的最大次数. 默认是 -1(无限). 如果指定count,将会被填充为完成的替换次数.

注意:

A,如果subject是一个数组, preg_replace()返回一个数组, 其他情况下返回一个字符串.

B,如果匹配被查找到, 替换后的subject被返回, 其他情况下返回没有改变的subject. 如果发生错误, 返回NULL .

C,子模式可以应用到参数replacement中,使用方式为\n或者${n}。(在正则表达式的模式中我们只能使用\n的形式来获取已经匹配的子模式,切记!)

D,如果使用模式修正符e,则参数replacement中可以解析函数。(在其它的正则表达式处理函数中,模式修正符e均被忽略!)

请看下面的综合示例:

<?php 
$pattern = '/(php)|(mysql)/e'; 
$string = '这个字符串中的php和mysql被替换成大写的了!'; 
$result = preg_replace($pattern, 'strtoupper("${1}\2")', $string, -1, $count); 
echo $result.'<br>'; 
echo $count; 
?>

上例中,我们使用了模式修正符e,这样的话strtoupper()函数就可以当作字符串被解析,这就是模式修正符e的作用!而参数${1}和\2分别是子模式1和子模式2。上例的作用就是将字符串$string中匹配到的子模式php和mysql替换成大写字母!

4,preg_split()函数。

preg_split执行一个正则表达式分隔字符串。其定义如下:

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

实际上就是将subject按照pattern分割,返回分割后的数组。其中,limit将限制分隔得到的子串最多只有limit个, 返回的最后一个子串将包含所有剩余部分.limit值为-1, 0或null时都代表"不限制"。

我们来看一个示例:

<?php 
$pattern = '/<p>(.*?)<\/p>/'; 
$string = '这个字符串中的<p>php</p>和<p>mysql</p>被分割了!'; 
$result = preg_split($pattern, $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
print_r($result); 
?>

上例中,我们使用了常量PREG_SPLIT_DELIM_CAPTURE设 置返回结果中包含子模式(如果设置为PREG_SPLIT_NO_EMPTY,preg_split()将进返回分隔后的非空部分。)我们如果把上例中正 则表达式的括号去掉,则结果中不再包含php和mysql这两个匹配成功的子模式。

常用的正则表达式处理函数我们就介绍完了,本节的例子可能会难一些,但希望大家还是认真的试验并体会一下,后面的正则表达式应用部分,我们会经常使用正则表达式处理函数。

PHP 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
php数据库密码的找回的步骤
Jan 12 PHP
php修改时间格式的代码
May 29 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php设置页面超时时间解决方法
Sep 22 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
Yii CGridView用法实例详解
Jul 12 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 #PHP
PHP超级全局变量数组小结
Oct 04 #PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 #PHP
php 保留字列表
Oct 04 #PHP
php使HTML标签自动补全闭合函数代码
Oct 04 #PHP
php中explode与split的区别介绍
Oct 03 #PHP
PHP explode()函数用法、切分字符串
Oct 03 #PHP
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
PyQt5每天必学之关闭窗口
2018/04/19 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
python批量修改文件名的示例
2020/09/27 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
如何高效率的查找一个月以内的数据
2012/04/15 面试题
建材业务员岗位职责
2013/12/08 职场文书
外贸业务员工作职责
2014/01/06 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
参加招聘会后的感想
2015/08/10 职场文书
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL