不要使用此函数来获取 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);
所以最终结果类似于
[