0

我正在使用 nbbc.sourceforge.net 进行 bbcode 标签解析。您可以在此处查看实际问题:Github。NBBC 问题 #1。

当我解析包含编程语言的 bbcode 的文本时,例如 php 的规则,它将 php bbcode 标记替换为 pre 标记:

$bb = new BBCode;

$bb->AddRule('php',array(
    'simple_start'=>'<pre>',
    'simple_end'=>'</pre>',
    'allow_in'=>false,
));

我在 pre 中有一个空行,它划分了正常的行,这里是这个图片:

pre 中的空行

如果我将使用$bb->SetIgnoreNewlines(true);比新行将不存在于文本中而不存在于 pre 中。如何解决?

<!DOCTYPE html">
<html">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>NBBC</title>
    </head>
    <body>
    <style>
    pre { margin: 2px; border: 1px solid #c2c2c2; width: 400px; }
    div.content { border: 4px dotted #27BFC5; margin: 2px; padding: 4px; width: 407px; }
    </style>
        <?php 

            require_once('nbbc-master/nbbc.php');

            $bb = new BBCode;

            // $bb->SetIgnoreNewlines(true);

            $bb->AddRule('php',array(
                'simple_start'=>'<pre>',
                'simple_end'=>'</pre>',
                'allow_in'=>false,
            ));

            echo '<div class="content">'.$bb->Parse($_POST['content']).'</div>';

        ?>

<!-- Content for test, just copy it into the textarea
Test new lines in code

While it work.
Great!
[php]

$a ="test A";

$b =$a;
$c =$b;

[/php]
End Tests!
-->

        <form action="" method="post">
            <textarea name="content" cols="50" rows="13"></textarea> <br />
            <input type="submit" value="submit" name="submit" />
        </form>
    </body>
</html>

更新 (1)我尝试使用回调:

$content = preg_replace_callback('/(.*\[php\])(.*)(\[\/php\])(.*)/is',function($matches){
                return trim($matches[1]).str_replace("\n\n","\n",trim($matches[2])).trim($matches[3]).trim($matches[4]);
            },$_POST['content']);

但无论如何这些都会中断:

碎屑

更新 (2)。好吧,这就是我所做的,但我不认为这是最终的解决方案:

$bb = new BBCode;

            // $bb->SetIgnoreNewlines(true);

            $bb->AddRule('php',array(
                'simple_start'=>'<pre>',
                'simple_end'=>'</pre>',
                'allow_in'=>false,
            ));

            $content = preg_replace_callback('/(.*\[php\])(.*)(\[\/php\].*)/is',
            function ( $matches ) { return $matches[1].trim($matches[2]).$matches[3]; }
            ,$_POST['content']);

            $content = $bb->Parse($_POST['content']);

            $content = preg_replace_callback('/(.*<pre>)(.*)(<\/pre>.*)/is',
            function ( $matches ) { return trim($matches[1]).preg_replace('/<br \/>/is','',trim($matches[2])).trim($matches[3]); }
            ,$content);

            echo '<div class="content">'.$content.'</div>';

对于 NBBC 图书馆,此问题仍处于搁置状态。

更新 (3)立场:

$content = $bb->Parse($content);

        $content = preg_replace_callback('/(.*<pre.*?>)(.*)(<\/pre>.*)/is',
        function ( $matches ) { 
            return trim($matches[1]).str_replace('<br />','',trim($matches[2])).trim($matches[3]); 
        }
        ,$content);
4

1 回答 1

1

trim()应该删除前导和尾随空格,包括换行符,而不影响用户开始输入文本后的换行符。你可以通过[php][/php]块的内容trim()吗?

或者,在重新阅读问题后,将 a 插入str_replace("\n\n", "\n", $input)其中以用单个换行符替换双换行符?

于 2013-10-07T13:33:56.880 回答