使用php regex为BBcode制作[code][/code]


Making a [code][/code] for BBcode with php regex

我想为bbcode制作一个[code][/code]标记,这样我制作的php正则表达式就不会考虑里面的内容。

示例:

Hello [b]newbie[/b], to write in bold, use the following : [code][b](YOURTEXT)[/b][/code]

应以HTML:形式返回

Hello <strong>newbie</strong>, to write in bold, use the following : [b](YOURTEXT)[/b]

以下是我的bbcode函数的一部分视图:

<?
function bbcode($var) {
   $var = preg_replace('`'[b'](.+)'[/b']`isU', '<strong>$1</strong>', $var); 
   $var = preg_replace('`'[i'](.+)'[/i']`isU', '<em>$1</em>', $var);
   $var = preg_replace('`'[u'](.+)'[/u']`isU', '<u>$1</u>', $var);
   return $var;
}
?>

提前感谢您的帮助!


编辑:以下是我最终如何做到的:

<? 
function bbcode($var) {
$var2 = preg_split('`('[code].*?'[/code])`isU', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$var = preg_replace('`'[b'](.+)'[/b']`isU', '<strong>$1</strong>', $var); 
$var = preg_replace('`'[i'](.+)'[/i']`isU', '<em>$1</em>', $var);
$var = preg_replace('`'[u'](.+)'[/u']`isU', '<u>$1</u>', $var);
$var = preg_replace('`('[code].*?'[/code])`isU', $var2[1], $var);
$var = preg_replace('`'[code'](.+)'[/code']`isU', '<div>$1</div>', $var);
return $var;
}
$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]';
echo bbcode($text); 
?>

然而,还有一个新的问题:如果字符链直接以"[代码]"开头,例如

[code][b]你好[/b][/code]测试

结果将是:

测试

这是因为$var2[1]现在导致了[/code]之后的内容。

有人能帮我做一个更好的定界吗?这也适用于第二个字符链?提前谢谢!

最后,我解决了所有的问题:

<?
function bbcode($var) {
   $var2 = getStringBetween($var, '[code]', '[/code]');
   $var = preg_replace('`'[b'](.+)'[/b']`isU', '<strong>$1</strong>', $var); 
   $var = preg_replace('`'[i'](.+)'[/i']`isU', '<em>$1</em>', $var);
   $var = preg_replace('`'[u'](.+)'[/u']`isU', '<u>$1</u>', $var);
   $var = preg_replace('`('[code].+'[/code])`isU', '<div>'.$var2.'</div>', $var);
   return $var;
}
function getStringBetween($str,$from,$to)
{
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
    return substr($sub,0,strpos($sub,$to));
}
$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]';
echo bbcode($text); 
?>