почему nl2br много & lt; br & gt;

Я создаю парсер 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;
}

Мой тест:
Между [таблицей] и [/ таблицей] покажите шесть раз \ n.
так раньше [таблица] появилась шесть раз

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

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

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

Благодарю.

0

Решение

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

Например:

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

Другие решения

Я нашел ответ: nl2br () в текстовой области с BBCode и HTML-кодом

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

По вопросам рекламы [email protected]