我正在使用 PECL bbcode 扩展来定义一组我允许用于论坛的标签。我已经实现了http://www.bbcode.org中描述的几乎所有标签。
论坛用户已经开始期望,当他们在输入字段中换行时,他们的帖子也会换行。我正在努力做到这一点。
nl2br()
方式_
nl2br()
非常适合让浏览器在用户键入时使用换行符,因为它会找到换行符并<br />
在其中抛出标签以使浏览器也使用换行符。但这会给一些更复杂的标记带来麻烦。
例如:
[ul]
[li]list item 1[/li]
[li]list item 2[/li]
[/ul]
结果是
<ul><br />
<li>list item 1</li><br />
<li>list item 2</li><br />
<ul>
这会在任何地方抛出空格。出于同样的原因,表格也有类似的问题。此外,任何实际显示空格的标签(例如<pre><code>code goes here</code></pre>
)都会被双倍行距。恶心。
CSS方式
CSS 有white-space
一些规则可以在这些情况下派上用场。如果我们将所有论坛帖子放在一个.bbcode
元素中,然后只包含样式表规则
.bbcode {
white-space: pre-line;
}
然后浏览器将保留换行符,折叠其他空格并换行。这听起来很理想。但是,列表项等仍然会出现这种双倍行距问题,因为浏览器会在每个</li>
.
我们可以通过定义来解决其中的一些问题:
.bbcode {
white-space: pre-line;
}
.bbcode * {
white-space: normal;
}
这缓解了列表和表格中的问题。但是,现在换行符只出现在帖子的根元素中,因此在例如表格单元格中使用换行符是行不通的。
我该怎么做?方法
我真正想要的是两种效果的组合:
- 当源在所有标签之外换行时,浏览器会换行
- 当源在块级或结构标签的关闭或打开之后不立即换行时,浏览器会换行
理想情况下,我认为[li]some\ntext[/li]
应该导致两行,[li]sometext[/li]\n
应该只导致一行,并且[i]sometext[/i]\n
应该导致两行。
这样的事情是怎么做的?或者更确切地说,人们通常在使用 bbcode 的论坛上做什么?我可能会编写一个函数,在其中定义<br />
应该插入 a 的所有情况,这闻起来很像重新发明许多轮子。