使用PHP将带有换行符的字符串分解为HTML段落

时间:2013-02-21 22:44:56

标签: php html string line-breaks

我从我的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 个答案:

答案 0 :(得分:15)

首先,使用<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>

答案 1 :(得分:0)

不爆炸字符串。

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

答案 2 :(得分: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))));

答案 3 :(得分:0)

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

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

这应该产生:

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

第2段第1行