$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是否返回任何变量。
答案 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);
使这个递归将保证任何级别的嵌套引号。