使用PHP将带换行符的字符串分隔成HTML段落


Break string with line breaks into HTML paragraphs with PHP

我正在从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>

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

首先,用<br />:替换换行符

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

然后用结束和开始段落标记替换双<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>

不分解字符串。

$post = "<p>" . nl2br($post_data['content']) . "</p>";

您可以尝试

$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))));

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

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

这应该产生:

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

段落2第1行