【发布时间】:2014-07-31 13:29:28
【问题描述】:
$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](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 是否返回任何变量。
【问题讨论】:
-
哦,我忘了,当然 preg_replace 是返回值.. 对不起我的错误
-
您能发布您遇到问题的实际内容吗?
-
[cytat=o0skar][cytat=o0skar]test nr2[/cytat][/cytat]
-
是的...正则表达式不能很好地处理嵌套内容。您的第一个替换将从第一个
[cytat]匹配到第一个[/cytat],这将破坏第二个。如果要处理嵌套表达式,则需要递归替换函数。 -
有一个 PHP 扩展可以处理 BBCodes - php.net/manual/en/book.bbcode.php
标签: php preg-replace