【问题标题】:why nl2br many <br>为什么 nl2br 很多 <br>
【发布时间】:2015-01-06 23:54:18
【问题描述】:

我创建了一个 bbcode 解析器 我在输出时使用了 nl2br() 。 但是,为什么会是这样的结果

输入

[table][tr][td]1[/td]
[td]2[/td]
[/tr]
[tr][td]3[/td]
[td]4[/td]
[/tr]
[/table]

[ul]
[li]1[/li]
[li]2[/li]
[li]3[/li]
[/ul]

[ol]
[li]A[/li]
[li]B[/li]
[li]C[/li]
[/ol]

输出

<br><br><br><br><br><br><table><tbody><tr><td>1</td>
<td>2</td>
</tr>
<tr><td>3</td>
<td>4</td>
</tr>
</tbody></table><br>
<br>
<ul><br>
<li>1</li><br>
<li>2</li><br>
<li>3</li><br>
</ul><br>
<br>
<ol><br>
<li>A</li><br>
<li>B</li><br>
<li>C</li><br>
</ol><br>

我的php函数

function showBBcodes($text) {

     $text = htmlspecialchars($text);
     preg_match_all('#\[code\](.*?)\[/code]#is', $text, $stack);  

    // BBcode array
    $find = array(
        '~\[ul\](.*?)\[/ul\]~s',
        '~\[li\](.*?)\[/li\]~s',
        '~\[ol\](.*?)\[/ol\]~s',
        '~\[table\](.*?)\[/table\]~s',
        '~\[tr\](.*?)\[/tr\]~s',
        '~\[td\](.*?)\[/td\]~s',
        '~\[img\](.*?)\[/img\]~s',
        '/\[img=(\d+)x(\d+)\](.*?)\[\/img\]/is'
    );

    // HTML tags to replace BBcode
    $replace = array(
        '<ul>$1</ul>',
        '<li>$1</li>',
        '<ol>$1</ol>',
        '<table>$1</table>',
        '<tr>$1</tr>',
        '<td>$1</td>',
        '<img src="$1" alt=""/>',
        '<img width="$1" height="$2" src="$3" alt="" />'
    );       
    $text = preg_replace($find,$replace,$text);
    $text = nl2br($text);

    foreach($stack[1] as $t) {
      $text = preg_replace('#\[code\].*?\[/code]#is','<div class="code_box">'.$t.'</div>', $text,1); 
    }
    return $text;
}

我的测试: 在 [ table ] 和 [/ table] 之间,显示六次 \n。 所以在 [table] 出现六次之前

我该如何解决?

我可以跳过不在 [table] [ul] [li] 中使用 nl2br 而是在 [tr] [li] 中使用吗??

或者任何人都可以给我更多建议

谢谢。

【问题讨论】:

  • 我不知道为什么,但您可以使用 ltrim 在表格输出之前去掉空格。 $text = ltrim($text);
  • 感谢您的回复。但我测试使用 $text = ltrim($text);在表格输出之前。仍然显示 6 次
    :(
  • 这是因为 showBBcodes() 之前没有添加任何空格。这是一个浏览器的东西,它把所有的 brs 都移到了表格标记之外。
  • 我认为这不是浏览器的事情。因为如果不是从 [table] 开始...就正常了

标签: php bbcode nl2br


【解决方案1】:

我找到了答案:nl2br() in textarea with BBCode and HTML code

$formattedText = preg_replace("/(<[a-zA-Z0-9=\"\/\ ]+>)<br\ \/>/", "$1", nl2br($text));

【讨论】:

  • 老实说,我宁愿不做 nl2br 的所有内容。无需将它们添加到
  • 因为它们会相应地格式化文本。您可以做的只是用
    .
  • 替换空行
  • 感谢您的评论。但我的项目是一个小论坛。你建议你的计划更好 nl2br?我会考虑你的提议
  • 【解决方案2】:

    仅对标签 li 和 td 的内容使用 nl2br

    例如:

    preg_match_all('#\[li\](.*?)\[/li]#is', $text, $stack);
    foreach($stack[1] as $t) {
      $text = str_replace($t, nl2br($t), $text); 
    }
    

    【讨论】:

    • 感谢您的回复。但其他我需要nl2br。所有内容都需要nl2br。只是想修复在[table]之前出现了六次。在 [ul] 和 [/ul] 之间
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签