6

我从我的 MySQL 数据库中获取文本,这些文本被分成几行(段落)。它存储在变量中$post_data['content']。如何使用换行符打印出来?

我目前正在使用的代码:

$post_data['content'] = explode("\n", $post_data['content']);
$post = "<p>" . implode("</p><p>", array_values($post_data['content'])) . "</p>";

这在我想要的程度上不起作用。

如果我在数据库中有这样的文本:

line 1 paragraph 1,
line 2 paragraph 1.

line 3 paragraph 2,
line 4 paragraph 2,
line 5 paragraph 2.

代码会像这样显示(我想要):

<p>line 1 paragraph 1,</p>

<p>line 2 paragraph 1.</p>

<p>line 3 paragraph 2,</p>

<p>line 4 paragraph 2,</p>

<p>line 5 paragraph 2.</p>

如果行之间没有空格(只有一个换行符),我希望它将段落组合在一起。也许爆炸后与阵列有关?

4

4 回答 4

17

首先,将换行符替换为<br />

$post = nl2br($post_data['content']);

然后用结束和开始段落标记替换 double <br />(原来的换行符由 维护nl2br,所以我使用了一个正则表达式,它匹配所有样式的换行符):

$post = '<p>' . preg_replace('#(<br />[\r\n]+){2}#', '</p><p>', $post) . '</p>';

请注意,这是 XHTML 语法,如果您想要 HTML,请更改代码如下:

$post = nl2br($post_data['content'], false);
$post = '<p>' . preg_replace('#(<br>[\r\n]+){2}#', '</p><p>', $post) . '</p>';

测试:

$post_data['content'] = <<<TXT
line 1 paragraph 1,
line 2 paragraph 1.

line 3 paragraph 2,
line 4 paragraph 2,
line 5 paragraph 2.
TXT;

$post = nl2br($post_data['content'], false);
$post = '<p>' . preg_replace('#(<br>[\r\n]+){2}#', "</p>\n\n<p>", $post) . '</p>';

echo $post;

测试输出:

<p>line 1 paragraph 1,<br>
line 2 paragraph 1.</p>

<p>line 3 paragraph 2,<br>
line 4 paragraph 2,<br>
line 5 paragraph 2.</p>
于 2013-02-21T23:06:07.200 回答
0

在不爆炸字符串的情况下。

$post = "<p>" . nl2br($post_data['content']) . "</p>";
于 2013-02-21T22:49:31.097 回答
0

你可以试试

$string = 'line 1 paragraph 1,
line 2 paragraph 1.

line 3 paragraph 2,
line 4 paragraph 2,
line 5 paragraph 2.';

echo implode("\n",array_map(function ($v) {
    return sprintf("<p>%s</p>", $v);
}, array_filter(explode("\n", $string))));
于 2013-02-21T22:55:05.973 回答
0

另一种选择,使用段落和换行符:

$post = '';
$paragraphs = explode("\n\n", $post_data['content']);
foreach ($paragraphs as $paragraph) {
    $post .= '<p>' . nl2br($paragraph) . '</p>';
}

这应该产生:

第 1
段 第 1 段 第 1 段 第 2 行

第 2 段第 1 行

于 2013-02-21T22:56:50.480 回答