preg_replace多个结果

时间:2013-07-23 16:44:00

标签: php preg-replace bbcode

我目前正在用PHP编写一个函数来翻译论坛引擎的BBCodes。 现在我想添加一个[code] - 标签,我创建了以下函数:

$txt = preg_replace('#\[code\](.*)\[(.*)\[/code\]#isU', "<div class=\"bb_uncode\">$1&#91;$2</div>", $txt); 

(旁注:&#91;等于[)
如果[code] -tags中只有一个[,那么这种方法非常有效,但它会忽略每一个{。}}。
是否有可能在每个其他括号上应用此搜索模式?

2 个答案:

答案 0 :(得分:1)

使用preg_replace_callback()执行此操作:

$txt = preg_replace_callback('#\[code\](.*)\[/code\]#isU', function($match) {
    return "<div class=\"bb_uncode\">" . 
           str_replace('[', '&#91;', $match[1]) .
           "</div>"); 
}, $txt);

答案 1 :(得分:0)

您只能使用 preg_replace 执行此操作:

$txt = preg_replace('~(?>\[code]|\G(?<!^))[^[]*+\K\[(?!/code])~i',
                    '&#91;', $txt);

模式细节:

(?>                 # open a non capturing group (atomic *)
  \[code]           # [code]
 |                  # OR
  \G                # contiguous to the last match
  (?<!^)            # and not preceded by the begining of the string
)                   # close the non capturing group
  [^[]*+            # 0 or more characters that are not a [ (possessive *)
\K                  # reset all that have been matched before
\[                  # a literal [
(?!/code])          # not followed by /code]

(*量词是占有性的,并且该组是原子的,以避免正则表达式引擎记录回溯位置。因此,该模式更具性能。但是,该模式可以在没有这些特征替换(?> {{1}的情况下工作。并删除(?:中的+。 您可以在此主题herehere找到更多信息。)