Preg_replace不会替换所有内容

时间:2014-07-31 13:29:28

标签: php preg-replace

$content = $this->comment->getContent(true);
$bbcodes = array (
  '#\[cytat=(.*?)\](.*?)\[/cytat\]#' => '<div class="cytata">\\1 napisał/a </div> <div class="cytatb">\\2</div>',
  '#\[cytat\](.*?)\[/cytat\]#' => '<div class="cytata">cytat</div><div class="cytatb">\\1</div>',
);

$content = preg_replace(array_keys($bbcodes), array_values($bbcodes), $content);

preg_replace并没有像这样替换每个标签。 例如,如果只有一个标签[cytat]some text[/cytat](细胞表示抛光中的引用)那么一切都会好的,输出将是

<div class="cytata">author napisał/a </div> <div class="cytatb">some text</div>                 

但是会有多个引号,然后preg只替换一个标记,例如

<div class="cytata">o0skar napisał/a </div> <div class="cytatb">[cytat=o0skar]test nr2</div>[/cytat]

那是双引号的输出等等。有什么想法吗?有什么问题?

也许我可以将preg_replace放在while循环中,但我不知道preg_replace是否返回任何变量。

1 个答案:

答案 0 :(得分:0)

为了正则表达式的精彩,让我们来看看这个。我不得不将模式改为1个字符。我删除了一个惰性?并将其设为preg_replace_callback

function pregcallbackfunc($matches){
    $pattern = '#\[cytat=(.*?)\](.*)\[/cytat\]#';
    if(preg_match($pattern, $matches[2])){
        $matches[2] = preg_replace_callback($pattern,'pregcallbackfunc', $matches[2]);
    }
    if($matches[2]){
        return '<div class="cytata">'.$matches[1].' napisał/a </div> <div class="cytatb">'.$matches[2].'</div>';
    }
    return '<div class="cytata">cytat</div><div class="cytatb">'.$matches[1].'</div>';
}

$content = '[cytat=o0skar][cytat=o0skar]test nr2[/cytat][/cytat]';
$content = preg_replace_callback('#\[cytat=(.*?)\](.*)\[/cytat\]#', 'pregcallbackfunc', $content);

使这个递归将保证任何级别的嵌套引号。