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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
PHP自动更新新闻DIY
Oct 09 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
memcache命令启动参数中文解释
Jan 13 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
PHP7内核之Reference详解
Mar 14 PHP
phpfpm的作用和用法
Oct 10 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 preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
windows下python安装pip方法详解
2020/02/10 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
局域网定义和特性
2016/01/23 面试题
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
企业总经理助理岗位职责
2014/09/12 职场文书