PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,p
发布时间:2020-12-13 06:11:10 所属栏目:PHP教程 来源:网络整理
导读:前面我们已经学习了正则表达式的基础语法,包括了定界符、原子、元字符和模式修正 符。实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数。本节我们就来介绍一下PHP中基于perl的正则表达式处理函数,主要包含了分割, 匹配,查找,替换等等处理
前面我们已经学习了正则表达式的基础语法,包括了定界符、原子、元字符和模式修正 符。实际上正则表达式想要起作用的话,就必须借用正则表达式处理函数。本节我们就来介绍一下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中.请看示例:<div class="codetitle"><a style="CURSOR: pointer" data="85569" class="copybut" id="copybut85569" onclick="doCopy('code85569')"> 代码如下:<div class="codebody" id="code85569"> <?php $pattern = '/.?</b>/'; $string = 'welcome to phpfunsdsadsadas'; if (preg_match($pattern,$string,$arr)) { echo "正则表达式{$pattern}和字符串{$string}匹配成功 "; print_r($arr); } else { echo "正则表达式{$pattern}和字符串{$string}匹配失败"; } ?> 2,preg_match_all()函数。函数preg_match_all()函数执行一个全局正则表达式匹配,其定义和preg_match()函数一致,只不过匹配了全部结果。请看示例:<div class="codetitle"><a style="CURSOR: pointer" data="77283" class="copybut" id="copybut77283" onclick="doCopy('code77283')"> 代码如下:<div class="codebody" id="code77283"> <?php $pattern = '/.?</b>/'; $string = 'welcome to phpfunsdsadsadas'; if (preg_match_all($pattern,$arr)) { echo "正则表达式{$pattern}和字符串{$string}匹配成功 "; print_r($arr); } else { echo "正则表达式{$pattern}和字符串{$string}匹配失败"; } ?> 依旧是上面的示例(只换了正则处理函数为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均被忽略!) 请看下面的综合示例:<div class="codetitle"><a style="CURSOR: pointer" data="55257" class="copybut" id="copybut55257" onclick="doCopy('code55257')"> 代码如下:<div class="codebody" id="code55257"> <?php $pattern = '/(php)|(mysql)/e'; $string = '这个字符串中的php和mysql被替换成大写的了!'; $result = preg_replace($pattern,'strtoupper("${1}2")',-1,$count); echo $result.' '; echo $count; ?> 上例中,我们使用了模式修正符e,这样的话strtoupper()函数就可以当作字符串被解析,这就是模式修正符e的作用!而参数${1}和2分别是子模式1和子模式2。上例的作用就是将字符串$string中匹配到的子模式php和mysql替换成大写字母! 4,preg_split()函数。preg_split执行一个正则表达式分隔字符串。其定义如下: array preg_split ( string $pattern,int $flags = 0 ]] ) 实际上就是将subject按照pattern分割,返回分割后的数组。其中,limit将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分.limit值为-1, 0或null时都代表"不限制"。 我们来看一个示例:<div class="codetitle"><a style="CURSOR: pointer" data="94778" class="copybut" id="copybut94778" onclick="doCopy('code94778')"> 代码如下:<div class="codebody" id="code94778"> <?php $pattern = '/ (.*?)</p>/'; php 和mysql 被分割了!';$result = preg_split($pattern,PREG_SPLIT_DELIM_CAPTURE); print_r($result); ?> 上例中,我们使用了常量PREG_SPLIT_DELIM_CAPTURE设 置返回结果中包含子模式(如果设置为PREG_SPLIT_NO_EMPTY,preg_split()将进返回分隔后的非空部分。)我们如果把上例中正 则表达式的括号去掉,则结果中不再包含php和mysql这两个匹配成功的子模式。 常用的正则表达式处理函数我们就介绍完了,本节的例子可能会难一些,但希望大家还是认真的试验并体会一下,后面的正则表达式应用部分,我们会经常使用正则表达式处理函数。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |