在双引号字符串中写 \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")。