如何用 <br/> 替换换行符或 \r\n?

93

我试图简单地替换一些换行符,尝试了三种不同的方法,但是我没有得到任何改变:

$description = preg_replace('/\r?\n|\r/', '<br/>', $description);
$description = str_replace(array("\r\n", "\r", "\n"), "<br/>", $description);
$description = nl2br($description);

这些应该都可以正常工作,但我仍然得到了新行符。它们是双倍的: "\r\r"。这不应该导致任何一个失败,对吧?


1
为什么你的代码中有裸露的\r换行符?据我所知,即使是MacOSX也已经改用\n了。 - ThiefMaster
它们来自客户的 CSV。 - theflowersoftime
10个回答

149

已经有nl2br()函数可以在换行符之前插入<br>标签:

示例(codepad):

<?php
// Won't work
$desc = 'Line one\nline two';
// Should work
$desc2 = "Line one\nline two";

echo nl2br($desc);
echo '<br/>';
echo nl2br($desc2);
?>

但如果仍然无法工作,请确保文本$desciption被双引号包含。

这是因为单引号不会“展开”转义序列,例如\n,与双引号字符串相比。PHP文档的引用:

注意:与双引号和heredoc语法不同,当它们出现在单引号字符串中时,变量和转义序列(特殊字符)将不会被展开。


1
仔细看,楼主明确表示他们尝试使用 nl2br,但它没有起作用。 - Tim Bielawa
刚刚尝试对一个含有多个回车换行的字符串运行nl2br函数,结果运行良好。 - Decko
1
看看我的编辑@ThomasMcCabe。我添加了一些(也许)有用的信息。 - Robik
32
请注意,nl2br并不是替换而是在换行符前插入 <br> 标签,因此保留了换行符并在其前面添加<br>标签。 - Brock Hensley
但是,如果我们有一个带有换行符的文件,并且想要通过 PHP 脚本读取并解释这些换行符,该怎么做? - user3911183

70

尝试使用这个:

$description = preg_replace("/\r\n|\r|\n/", '<br/>', $description);

15
这段代码的快速替代方案是 $description = str_replace(["\r\n", "\r", "\n"], "<br/>", $description),取自这个答案。它的作用是将$description中的换行符(包括\r\n, \r, 和 \n)替换为HTML的换行标记<br/> - Keale
10
也可以使用/\R/来匹配所有的CR/LF换行符组合 - mario

19

字符串中可能有真实字符 "\"(就像@Robik所说的单引号字符串一样)。

如果您非常确定应该将 '\r' 或 '\n' 字符串替换掉,我不是在说特殊字符而是一个由两个字符 '\' 和 'r' 组成的序列,那么请在替换字符串中转义 '\',它将起作用:

str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),"<br/>",$description);

nl2br很好,但这个实际上更有效(对于我的JSON内容),谢谢! - Valmond

10

试试这个:

echo str_replace(array('\r\n', '\n\r', '\n', '\r'), '<br>', $description);

8
阅读有关 PHP 字符串 的内容。'\r\n' 不同于 "\r\n" - axiac
谢谢@axiac,我没有时间测试,但是你的意思是应该像"\r\n"这样吧? - l2aelba
这个仅包含代码的答案会误导一些天真的研究人员。 - mickmackusa

6

nl2br()对我有用,但我需要使用双引号将变量包装起来:

这个有效:

$description = nl2br("$description");

这样行不通:

$description = nl2br($description);

什么是解释? - Peter Mortensen

6

nl2br()函数应该可以正常工作:

$description = nl2br($description);

很可能你的示例代码第一行未关闭的'引起了问题。请移除$description后面的'。
...$description');

3

这肯定会起作用:

str_replace("\\r", "<br />", $description); 
str_replace("\\n", "<br />", $description); 

绝对不正确的建议。"foo\r\nbar" 将变成 "foobar" 而不是 "foo<br/>bar"。在替换 HTML 之前,应该渲染为 "foo bar"。 - Artemix
有些特定情况下,输入格式已知时,这种方法是有效的。 - user1393215

2
$description = nl2br(stripcslashes($description));

1
这个答案缺少解释。 - mickmackusa
@softcod.com的答案允许替换查询中的字符串,例如:<br> $description = nl2br(stripcslashes($row["description"]));<br> stripcslashes返回一个去掉反斜杠的字符串。它识别类似C语言的\n、\r等转义字符,以及八进制和十六进制表示。 - luguen

1

我认为str_replace(array("\\r\\n", "\\r", "\\n"), " ", $string);起作用。


-3
如果您正在使用nl2br,所有出现的\n\r都将被替换为<br>。但是,如果(我不知道如何)仍然出现新行,您可以使用以下方法:
str_replace("\r","",$description);
str_replace("\n","",$description);

将不必要的换行符替换为空字符串。


str_replace 中,\r 似乎会替换掉所有内容。此外,你应该用 <br> 来替换它... - Willem Van Onsem

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