曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4214|回复: 0
打印 上一主题 下一主题

preg_replace() -- 字符串替换

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-5-22 13:42:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)
    
?>

运行输出:
2012-12-2
2012-12-21

在使用 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 个参数中的每个值都用此字符串作为替代之,反过来就没有什么意义了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-30 14:34 , Processed in 0.080515 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表