不要使用這個函式來擷取 BBCode,如前所述。如果您的文字超過 5000 個字元(平均值),它會超出限制並導致您下載 PHP 頁面。
根據這個說法,您應該使用更進階但更複雜的方法。您需要一個名為 "str_replace_once()" 的函式(搜尋它),一個名為 "countWord()" 的函式,以及著名的 "after()"、"before()"、"between()" 函式。
str_replace_once 的功能與 str_replace 相同,但只會取代第一個出現的字串。至於 countWord,我想您知道如何計算一個單字出現的次數。至於 after、before 和 between,這些函式您可以在網站上輕鬆找到其他使用者提供的版本。或者,您可以自己撰寫。
以下函式可以處理所有區塊,假設是 [code] 和 [/code],您可能希望括號之間的內容不被解析,包括在另一個 [code] 標籤內的 [code] 標籤。
<?php
function prepareCode($code, $op, $end)
{
$ix = 0;
$iy = 0;
$nbr_Op = countWord($op, $code);
while($ix < $nbr_Op)
{
if(in_string($op, before($end, $code), false))
{
$code = str_replace_once($op, substr($op, 0, -1).':'.$ix.']', $code);
$iy++;
}
elseif(in_string($end, before($op, $code), false))
{
$iy = $iy-1;
$code = str_replace_once($end, substr($end, 0, -1).':'.($ix-1).']', $code);
$ix = $ix-2;
}
$ix++;
}
while(in_string($end, $code))
{
$code = str_replace_once($end, substr($end, 0, -1).':'.($iy-1).']', $code);
$iy=$iy-1;
}
$code = preg_replace('#\\'.substr($end, 0, 1).':-[0-9]\]#i', '', $code);
if(in_string(substr($op, 0, -1).':0]', $code) && !in_string(substr($end, 0, -1).':0]', $code))
{
$code .= substr($end, 0, -1).":0]";
}
return $code;
}
?>
$code 會回傳整個半格式化的文字。您只需要像這樣使用它:
$code = prepareCode($code="您的文字", $op="[tag]" , $end="[/tag]");
然後只需替換父標籤
str_replace("[tag:0]", "<tag>", $code);
str_replace("[/tag:0]", "</tag>", $code);
所以最後會像這樣
[