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判断输入不超过mysql的varchar字段的长度范围
Jun 24 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
ThinkPHP分页类使用详解
Mar 05 PHP
php天翼开放平台短信发送接口实现方法
Dec 22 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
PHP、Java des加密解密实例
Apr 27 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
Laravel 连接(Join)示例
Oct 16 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Django视图扩展类知识点详解
2019/10/25 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
就业协议书范本
2014/04/11 职场文书
小学语文课后反思精选
2014/04/25 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
楚门的世界观后感
2015/06/03 职场文书
爱国主义主题班会
2015/08/14 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android