1

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

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

(旁注:&#91;等于 [)如果[code] 标记内
只有一个,这非常有效,但它会忽略每一个。 是否也可以将此搜索模式应用于所有其他括号?[

4

2 回答 2

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);
于 2013-07-23T17:06:32.243 回答
0

您只能使用preg_replace来做到这一点:

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

图案细节:

(?:                 # open a non-capturing group
  \[code]           # [code]
 |                  # OR
  \G                # contiguous to the last match
  (?!^)             # and not at 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])          # negative lookahead: not followed by /code]

(* 量词在这里是明确所有格的,因为即使字符类不包括[and 后跟一个字面量[,自动占有也不会发生,因为\K介于字符类和字面量之间[。但是,该模式也适用于一个“正常”量词。您可以在此处找到有关所有格量词和有关自动占有的更多信息。)

于 2013-07-23T19:55:15.230 回答