nl2br用于段落的换行

4
$variable = 'Afrikaans 
Shqip - Albanian  
Euskara - Basque';

如何将每个新行转换为段落?

$variable 应变成:

<p>Afrikaans</p>
<p>Shqip - Albanian</p>
<p>Euskara - Basque</p>
7个回答

18

试试这个:

$variable = str_replace("\n", "</p>\n<p>", '<p>'.$variable.'</p>');

3
感谢您保留换行符号。没有它,阅读HTML源代码将变得异常困难。请原谅我不提供解释和其他内容,我的任务是尽可能简洁地翻译所需内容。 - Your Common Sense

4
以下内容可解决问题:
$variable = '<p>' . str_replace("\n", "</p><p>", $variable) . '</p>';

2

请注意,在其他建议中,可能无法捕获某些换行符。 此功能适用于Windows、Linux或MacOS:

function nl2p($txt){
    return str_replace(["\r\n", "\n\r", "\n", "\r"], '</p><p>', '<p>' . $txt . '</p>');
}

1
$array = explode("\n", $variable);
$newVariable = '<p>'.implode('</p><p>', $array).'</p>'

1
<?php
$variable = 'Afrikaans  
Shqip - Albanian   
Euskara - Basque'; 
$prep0 = str_replace(array("\r\n" , "\n\r") , "\n" , $variable);
$prep1 = str_replace("\r" , "\n" , $prep0);
$prep2 = preg_replace(array('/\n\s+/' , '/\s+\n/') , "\n" , trim($prep1));
$result = '<p>'.str_replace("\n", "</p>\n<p>", $prep2).'</p>'; 
echo $result;
/*
<p>Afrikaans</p>
<p>Shqip - Albanian</p>
<p>Euskara - Basque</p>
*/
?>

说明:

$prep0和$prep1:确保每行以\n结尾。

$prep2:删除冗余的空格。保留换行符。

$result:添加p标签。

如果不包括$prep0、$prep1和$prep2,$result将会是这样的:

<p>Afrikaans  
</p>
<p>Shqip - Albanian   
</p>
<p>Euskara - Basque</p>

不太好,我认为。

此外,除非必须使用 preg_replace,否则不要使用。在大多数情况下,str_replace 更快(根据我的经验)。请参阅下面的评论以获取更多信息。


不,我不同意。对于这样微不足道的任务来说,这不是有点复杂了吗?而且你真的体验到preg_replace和str_replace之间的区别了吗?我无法相信。 - Your Common Sense
你问道:“这么小的任务是否有点复杂了?”嗯,这取决于你是否关心代码格式。如果你不在意并认为像上面灰色框中那样看起来没问题,那就不要使用$prep0、$prep1和$prep2。如果你像我一样在意代码格式,并想要良好格式化的代码,那就使用$prep0、$prep1和$prep2。 - matsolof
1
此外,在官方PHP网站php.net上的http://php.net/manual/en/function.str-replace.php页面上写道:“如果您不需要复杂的替换规则(如正则表达式),则应始终使用此函数[str_replace],而不是ereg_replace()或preg_replace()。” - matsolof
如果你还不相信我,可以去这些页面中的一些或全部查看:http://www.php-scripts.com/php_diary/011303.php3 --- http://www.simplemachines.org/community/index.php?topic=175031.0 --- http://ilia.ws/files/zend_performance.pdf --- http://blogs.digitss.com/php/php-performance-improvement-tips/ --- http://www.hm2k.com/posts/50-php-optimisation-tips-revisited --- 或者自己在谷歌上搜索“benchmark str_replace preg_replace”或类似的内容。 - matsolof
1
事实上是这样的。除此之外,我曾编写过用于计算大量单词(数百万个)的脚本。在编写代码时,有时使用 str_replace 而不是 preg_replace 可以使这些脚本快几秒钟。但我并不是 PHP 专家。 - matsolof
显示剩余3条评论

0

尝试:

$variable = 'Afrikaans
Shqip - Albanian  
Euskara - Basque';

$result = preg_replace("/\r\n/", "<p>$1</p>", $variable);
echo $result;

0

我知道这是一个非常古老的帖子,但我想强调,建议的解决方案在HTML世界中可能会有一些问题:

  1. 他们没有检查是否已经有一个相应段落的 p 标签。这可能会导致额外的段落。至少一些浏览器会将其显示为额外的段落,意味着 <p>line1<p>line2</p>line3</p> 将会产生 3 个段落,这可能不是意图。
  2. 实际上,有一堆标签不应该出现在 p 内部,根据 phrasing contentspec。或者说只有一组有限的标签可以出现。
  3. 他们会更改标签内的换行符,而您希望保留原样的换行符。通常情况下,您可能希望在 pretextarea 中进行更改。 codesampkbdvar 是其他常见值的示例,但从技术上讲,它可以是任何具有 white-space CSS 属性设置为 prepre-wrappre-linebreak-spaces 的标签。
  4. 他们通常只检查 \r\n 或仅 \r\n,而实际上有更多的符号表示换行,并且它们还具有相应的 HTML 实体,这在 HTML 字符串中很容易出现。
为了“解决”这些缺陷,我刚刚发布了一个nl2tag库,可以将换行符“转换”成<li>项,并具有“改进”的nl2br逻辑(主要是为了保留空格)。
它远非完美(请查看自述文件以了解限制),但在处理相对简单的HTML字符串时应该能满足您的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接