PHP函数preg_replace()

zxh5566  2016-08-09 19:27   Hits: 

该函数可以执行正则表达式的搜索和替换,是一个最强大的字符串替换处理函数,该函数会有三个参数,subject中搜索第一个参数pattern模式的匹配项,并替换为第二个参数,如果指定了第四个可选参数limit,则仅替换limit个匹配,如果省略limit或者其值为-1,则所有的匹配都会被替换

<?php
$pattern = "/<[\/\!]*?[^<>]*?/";
$text = "这个文本中有<b>加粗</b>和<u>都有下划线</u>以及<i>斜体</i>还有<font color='red' size='7'>带有颜色和字体大小</font>的标记";
echo preg_replace($pattern,'',$text);
echo "<br>";
echo preg_replace($pattern,''$text,2);
?>

上例是preg_replace()函数最简单的用法,只是将文本$text中根据$pattern模式搜索到的html标签全部替换为空,即删除所有HTML标记,也可以通过第四个参数传入一个整数,用来指定替换的次数。

使用preg_replace()函数时,最常见的形式就是可以包含反向引用,即使用\\n的形式依次引用正则表达式中的模式单元,每个此种引用将被替换为与第n个被捕获的括号内的子模式所匹配的文本,n可以从0到99,其中\\0指的是被整个模式所匹配的文本,对左圆括号从左到右计算以取得子模式的数目,对替换模式在一个逆向引用后面紧接着一个数字时,不能使用熟悉的\\1符号来表示逆向引用,举例说明\\1,将会使preg_replace()搞不清楚是想要一个\\1的逆向引用后面跟着一个数字1还是一个\\1的逆向引用,本例解决的方法是使用\${1}1,这会形成一个隔离的$1逆向引用,而使另一个1只是单纯的文字

<?php
$pattern = "/(\d{2})\/(\d{2})\/(\d{4})/";
$text = "今年春节放假日期为01/25/2009到02/02/2009共7天";
echo preg_replace($pattern,"\\3-\\1-\\2",$text);
echo preg_replace($pattern,"\$(3)-\$(1)-\$(2)");
?>

该程序的输出结果为

今年春节放假日期为2009-01-25到2009-02-02共7天
今年春节放假日期为2009-01-25到2009-02-02共7天

在使用preg_replace()函数时,有一个专门为它提供的模式修饰符"e",也只有preg_replace()函数使用此修饰符,如果设定了此修饰符,函数preg_replace()在替换字符串中对逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换搜索的字符串,要确保第二个参数构成一个合法的PHP代码字符串,否则PHP会在报告在包含preg_replace()的行中出现语法解析错误

<?php
$pattern = "/(<\/?)(\w+)([^>]*>)/e";
$text = "这个文本中有<b>加粗</b>和<u>都有下划线</u>以及<i>斜体</i>还有<font color='red' size='7'>带有颜色和字体大小</font>的标记";
echo preg_replace($pattern,"'\\1'.strtoupper('\\2').'\\3'",$text);//将所有HTML标签小写改成大写
?>

在上例中声明正则表达式时,使用了模式修正符"e",所以函数preg_replace()中第二个参数的字符串将作为PHP代码求值
在使用preg_replace()函数时,其前三个参数均可使用数组,如果第三个参数是一个数组,则会对它中的每个元素都执行搜索和替换,并返回替换后的一个数组,如果第一个参数和第二个参数都是数组,则会依次从中分别取出对应的值来对第三个参数中的文本进行搜索和替换,如果第二个参数中的值比第一个参数中少,则用空字符串作为余下的替换值。如果第一个参数是数组而第二个参数是字符串,则对第一个参数中的每个值都用此字符串作为替换值,反过来则没有意义。

上一篇:PHP字符串处理函数strstr()、strpos()、strrpos()、sub
下一篇:PHP字符串替换函数str_replace()