почему nl2br много ‹br›

Я создаю парсер 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. поэтому до того, как [таблица] появлялась шесть раз

как я могу это исправить?

могу ли я пропустить, чтобы не использовать nl2br в [table] [ul] [li], но использовать в [tr] [li]??

или кто-нибудь может дать мне больше предложений

Благодарю.


person Sky    schedule 10.11.2014    source источник
comment
Я не уверен, почему, но вы можете использовать ltrim, чтобы избавиться от пробелов перед выводом таблицы. $text = ltrim($text);   -  person MinusFour    schedule 10.11.2014
comment
Спасибо за ответ. Но я проверяю использование $text = ltrim($text); до вывода таблицы. все еще показывают 6 раз ‹br› :(   -  person Sky    schedule 10.11.2014
comment
Это потому, что showBBcodes() раньше не добавляла никаких пробелов. Это вещь браузера, он перемещает все brs за пределы разметки таблицы.   -  person MinusFour    schedule 10.11.2014
comment
Я думаю, что дело не в браузере. потому что если не начинать с [таблицы]... будет нормально   -  person Sky    schedule 10.11.2014


Ответы (2)


Используйте nl2br только для содержимого тегов li и td

Например:

preg_match_all('#\[li\](.*?)\[/li]#is', $text, $stack);
foreach($stack[1] as $t) {
  $text = str_replace($t, nl2br($t), $text); 
}
person newman    schedule 10.11.2014
comment
Спасибо за ваш ответ. Но другой мне нужен nl2br. весь контент нужен nl2br. просто хочу исправить появилось шесть раз до [таблица]. и Между [ul] и [/ul] - person Sky; 10.11.2014