2013-07-23 121 views
1

我目前正在用PHP編寫一個函數來爲論壇引擎翻譯BBCodes。 現在我想添加一個[code] - 標籤和我創建了以下功能:preg替換多個結果

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

(旁註:&#91;平等[)
這工作得很好,如果只有一個[的[代碼中]標籤都有效,但它會忽略每一個。
是否有可能將此搜索模式應用於每個其他括號?

回答

1

preg_replace_callback()這樣做:

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

模式的細節:

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

您可以了preg_replace只有做到這一點

(?>     # 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] 

(*量詞是佔有慾該組是原子的,以避免正則表達式e ngine錄音回溯位置。所以,這個模式更高效。但是,該模式可以在沒有這些功能的情況下替換(?>(?:並刪除+*+。 您可以在此主題找到更多信息herehere。)