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 相关文章推荐
php变量作用域的深入解析
Jun 03 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
php两种无限分类方法实例
Apr 21 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
php xhprof使用实例详解
Apr 15 PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 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
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
Python 元类实例解析
2018/04/04 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
python实现批处理文件
2020/07/28 Python
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
写自荐信三大法宝
2014/01/24 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
销售员岗位职责
2015/02/10 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
Python实现简单的猜单词
2021/06/15 Python
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL