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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
php截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
sphinx增量索引的一个问题
Jun 14 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
linux下php上传文件注意事项
Jun 11 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP中phar包的使用教程
Jun 14 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 PHP
TP5多入口设置实例讲解
Dec 15 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异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
PHP处理会话函数大总结
2015/08/05 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Sublime开发python程序的示例代码
2018/01/24 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
python的range和linspace使用详解
2019/11/27 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
《苏珊的帽子》教学反思
2014/04/07 职场文书
家长学校工作方案
2014/05/07 职场文书
统计专业自荐书
2014/07/06 职场文书
高一军训感想
2015/08/07 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers