我目前正在用PHP编写一个函数来翻译论坛引擎的BBCodes。
现在我想添加一个[code]
- 标签,我创建了以下函数:
$txt = preg_replace('#\[code\](.*)\[(.*)\[/code\]#isU', "<div class=\"bb_uncode\">$1[$2</div>", $txt);
(旁注:[
等于[)
如果[code] -tags中只有一个[
,那么这种方法非常有效,但它会忽略每一个{。}}。
是否有可能在每个其他括号上应用此搜索模式?
答案 0 :(得分:1)
使用preg_replace_callback()
执行此操作:
$txt = preg_replace_callback('#\[code\](.*)\[/code\]#isU', function($match) {
return "<div class=\"bb_uncode\">" .
str_replace('[', '[', $match[1]) .
"</div>");
}, $txt);
答案 1 :(得分:0)
您只能使用 preg_replace 执行此操作:
$txt = preg_replace('~(?>\[code]|\G(?<!^))[^[]*+\K\[(?!/code])~i',
'[', $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}的情况下工作。并删除(?:
中的+
。
您可以在此主题here和here找到更多信息。)