注册 登录
编程论坛 PHP技术论坛

PHP 正则替换的问题

zhangyao3287 发布于 2014-04-23 17:11, 2083 次点击
$content   = str_replace($value, $this->replaceLoop($labelInfo, $labelLoop, $nowNum, $listdb), $content);
这里会把相同的[loop=1]{style}[/loop]都给替换掉,但是我希望是把数据库的数据次序替换,有什么办法么,求大神帮忙,

$content = "[loop=1]{style}[/loop][loop=1]{style}[/loop][loop=1]{style}[/loop][loop=1]{style}[/loop]";
我希望替换成$content = "$listdb[0][title]$listdb[1][title]$listdb[2][title]$listdb[3][title]";
但是现在的结果是$content = "$listdb[0][title]$listdb[0][title]$listdb[0][title]$listdb[0][title]";

程序代码:
function replaceStyleLoop($listdb, $content) {
        if(count($listdb) < $this->labelNum) $this->labelNum = count($listdb);

        if(strpos($content, "[loop") < 0) $content = "[loop={@num}]" . $content;
        if(!strpos($content, "[/loop]")) $content .= "[/loop]";
        $content = str_replace("{@num}", $this->labelNum, $content);

        $nowNum = 0;
        preg_match_all("/\[loop=\d*][\s\S]*?\[\/loop]/", $content, $array);
        foreach($array[0] as $key => $value) {
            preg_match("/\[loop=\d*]/", $value, $arrNum);
            $labelLoop = (int)str_replace("[loop=", "", str_replace("]", "", $arrNum[0]));
            $labelInfo = str_replace("[loop=$labelLoop]", "", str_replace("[/loop]", "", str_replace("[loop]", "", $value)));
            $content   = str_replace($value, $this->replaceLoop($labelInfo, $labelLoop, $nowNum, $listdb), $content);
            $nowNum += $labelLoop;
            if($nowNum >= $this->labelNum) break;
        }
        $content = preg_replace("/\[loop=\d*][\s\S]*?\[\/loop]/", "", $content);
        return $content;
    }


[ 本帖最后由 zhangyao3287 于 2014-4-23 17:15 编辑 ]
2 回复
#2
asmdaydream2014-04-24 11:05
preg_replace 可以指定只替换一个

程序代码:
<?php

$content = "[loop=1]{style}[/loop][loop=1]{style}[/loop][loop=1]{style}[/loop][loop=1]{style}[/loop]";
$listdb = array(array('title'=>'db1'),array('title'=>'db2'),array('title'=>'db3'));

$pa = '/\[loop=1\]\{style\}\[\/loop\]/';
preg_match_all($pa, $content, $matches);

$count = count($matches[0])>count($listdb)?count($listdb):count($matches[0]);

for ($i=0;$i<$count;$i++){
    $content = preg_replace($pa, $listdb[$i]['title'], $content,1);
}

print_r($content);

结果 db1db2db3[loop=1]{style}[/loop]
#3
zhangyao32872014-04-25 11:05
哈哈,非常感谢
1