preg_replace() 的功能是执行正则搜索和替换,原型如下:
[Plain Text] 纯文本查看 复制代码 mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
该函数从第 3 个参数 $subject 中按照第 1 个参数 $pattern 给出的模式进行搜索,然后将其替换为第 2 个参数 $replacement 所表示的内容。如果指定了第 4 个参数 $limit,那么仅替换 $limit 个匹配,如果省略该参数或者其值为 -1,那么所有的匹配项都会被替换。
测试代码-1:
[PHP] 纯文本查看 复制代码 <?php
$pattern = "/<[\/\!]*?[^<>]*?>/is";
$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);
?>
上面代码根据 $pattern 模式搜索 HTML 标记,第一次运用 preg_replace() 函数时,删除掉了所有的 HTML 标记;第二次运用时,指定只删除头 2 个 HTML 标记。因此,输出为:
在使用 preg_replace() 函数时,最常用的形式是包含反向引用。注意,对替换模式在一个逆向引用后面紧跟着一个数字时 --- 如 \\11 ,这里分为两部分:\\1 引用一个子模式匹配文本,1 表示一个单纯的数字 --- 不能如这种形式引用,否则函数就搞不清楚到底是要引用第 11 个匹配子模式还是引用第 1 个匹配子模式且另加上一个单纯的数字 1。解决的办法是使用:\${1}1 这种形式。这样会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。如下代码所示:
[PHP] 纯文本查看 复制代码 <?php
$pattern = "/(\d{1})\/(\d{2})\/(\d{4})/";
$text = "2/12/2012";
echo preg_replace($pattern, "\\3-\\2-\\1", $text);
echo "<br>";
echo preg_replace($pattern, "\\3-\${2}-\${1}1", $text)
?>
运行输出:
在使用 preg_replace() 时,有一个专门为它而设的修正符 "e" ,这是 preg_replace() 函数的专属修正符。如果设定了该修正符,那么 preg_replace() 在替换字符串时对逆向引用做正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。要确保第 2 个参数构成一个合法的 PHP 代码字符串,否则 PHP 会在报告出现语法解析错误。测试代码如下:
[PHP] 纯文本查看 复制代码 <?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 的小写标记替换为大写。
preg_replace() 函数的前 3 个参数均可以使用数组。如果第 3 个参数是一个数组,那么会对它里面的每个元素都进行搜索和替换,并返回替换后的一个数组。
[PHP] 纯文本查看 复制代码 <?php
$pattern = "/Windows/";
$text = array ("UNIX", "Windows", "MacX", "Windows");
$newarray = preg_replace($pattern, "Linux", $text);
print_r($newarray);
?>
运行输出:Array ( [0] => UNIX [1] => Linux [2] => MacX [3] => Linux )
如果第 1 个参数和第 2 个参数都是数组,则 preg_replace() 函数会依次从中分别取出对应的值来对第 3 个参数中的文本进行搜索和替换:
[PHP] 纯文本查看 复制代码 <?php
$pattern = array ("/Windows/", "/Linux/", "/Unix/");
$subarray = array ("Baidu", "Google", "IBM");
$text = "Windows is a good system and pepole like Windows. Linux si a great system,
and programer like Linux. Unix is a system that difficult to use
and less pepole like Unix.";
echo preg_replace($pattern, $subarray, $text);
?>
运行输出:Baidu is a good system and pepole like Baidu. Google si a great system, and programer like Google. IBM is a system that difficult to use and less pepole like IBM.
如果第 2 个参数中的值比第 1 个参数中的少,则用空字符串作为余下的替换值:
[PHP] 纯文本查看 复制代码 <?php
$pattern = array ("/Windows/", "/Linux/", "/Unix/");
$subarray = array ("Baidu", "Google");
$text = "Windows is a good system and pepole like Windows. Linux si a great system,
and programer like Linux. Unix is a system that difficult to use
and less pepole like Unix.";
echo preg_replace($pattern, $subarray, $text);
?>
运行输出:Baidu is a good system and pepole like Baidu. Google si a great system, and programer like Google. is a system that difficult to use and less pepole like .
如果第 1 个参数是数组而第 2 个参数是字符串,则对第 1 个参数中的每个值都用此字符串作为替代之,反过来就没有什么意义了。 |