Menu

PHP 换行:\n、PHP_EOL 和 nl2br

在 PHP 中输出换行,可以在双引号中写 "\n",或者使用 PHP_EOL。在网页中换行符是看不见的,所以要用 <br> 或 nl2br()。了解它们的区别、为什么单引号中的 '\n' 不起作用,以及如何按行拆分或去掉换行符。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

在双引号字符串中写 \n 即可输出换行:echo "Line 1\nLine 2";。常量 PHP_EOL 的作用相同,写在一行末尾时读起来更清楚:echo 'Done' . PHP_EOL;。在网页中,换行符不会显示为换行;这时需要用 <br> 或 nl2br()。

单引号与双引号

\n 和 \t 这样的转义序列只在双引号中有效。在单引号中,'\n' 是两个字符:一个反斜杠和字母 n。这就是“\n 不起作用”最常见的原因。

字符串 页面列出了双引号能识别的所有转义序列。

PHP_EOL 与 "\n"

PHP_EOL 是 PHP 所在系统的行结束符:在 Linux 和 macOS 上是 "\n",在 Windows 上是 "\r\n"。用它来输出到终端,以及写入将在同一台机器上读取的文件。如果某种格式规定了自己的行结束符,就使用格式规定的那个:HTTP 头和电子邮件需要 "\r\n",而大多数工具在任何系统上都能正常读取 "\n"。

"\r" 是回车符,"\n" 是换行符。Windows 文件用两者组合 "\r\n" 结束一行,所以来自 Windows 用户或 <textarea> 的文本中常常会出现意料之外的 \r 字符。

HTML 中的换行:br 和 nl2br

浏览器会把换行符合并成一个空格,所以 echo "a\nb" 在页面上显示为 a b。要么自己输出 <br>,要么在文本中保留换行符,再用 nl2br() 转换,它会在每个换行符前插入 <br />。运行下面的代码,对比“输出”和“页面”两个标签页:

在“输出”标签页中,三者看起来差不多。在“页面”标签页中,第一个挤在一行里,nl2br() 把它分成了多行,<pre> 则按原样保留了换行。

显示 textarea 输入并保留换行

<textarea> 中的文本会保留用户输入的分行,但在把它输出到 HTML 之前必须先转义。顺序很重要:先 htmlspecialchars(),再 nl2br(),否则 <br /> 标签本身也会被转义。运行代码,在文本框中输入几行内容,然后点击 Preview:同一个脚本会再次运行,这时 $_POST 已经有了数据。

textarea 中的换行可能以 "\r\n" 或 "\n" 的形式提交;两者都包含 "\n",所以统计这个字符在两种情况下都有效。htmlspecialchars() 解释了为什么这里必须转义。

按换行符拆分字符串

对于你自己创建的文本,explode("\n", $text) 就够用了。对于来自用户或文件的文本,行结束符可能是 "\r\n"、"\n" 或 "\r";preg_split('/\R/', $text) 能处理所有这些情况,因为 \R 可以匹配任何换行符。

去掉字符串中的换行符

要把多行文本变成一行,就把每种行结束符都替换掉。先替换 "\r\n",再替换单个字符,否则每个 Windows 换行都会变成两个空格:

trim() 和 rtrim() 会去掉字符串两端的换行符,但从不处理中间的,所以它们适合处理从文件中读取的一行,却不适合用来把多行合并成一行。

常见问题

PHP 中怎么用 echo 输出换行?

在双引号字符串中写 \n:echo "Line 1\nLine 2";。或者在末尾拼接常量:echo 'Line 1' . PHP_EOL;。浏览器中不会显示换行符,在那里要用 <br> 或 nl2br()。

PHP 中 \n 为什么不起作用?

要么字符串用的是单引号,'\n' 在单引号中就是一个反斜杠加一个 n;要么输出是以 HTML 显示的,而浏览器会把换行符当作空格处理。文本输出时在双引号中使用 "\n",网页中则使用 nl2br() 或 <br>。

PHP_EOL 是什么?

一个常量,保存的是 PHP 所在操作系统的行结束符:在 Linux 和 macOS 上是 "\n",在 Windows 上是 "\r\n"。用于输出到终端或本地文件的内容;对于 HTTP、电子邮件和 CSV 文件,通常由格式本身规定行结束符,与操作系统无关。

PHP 中 nl2br 有什么作用?

nl2br($text) 会在字符串中的每个换行符前插入 <br />,所以在 <textarea> 中输入的文本以 HTML 显示时能保留原来的分行。记得先转义:nl2br(htmlspecialchars($text))。

PHP 中怎么去掉字符串中的换行符?

把三种行结束符都替换掉:str_replace(["\r\n", "\r", "\n"], ' ', $text),或者使用正则表达式 preg_replace('/\R/', ' ', $text)。如果只想去掉末尾的换行符,使用 rtrim($text, "\r\n")。

Coddy 编程语言插图

和 Coddy 一起学编程

开始