\n 与 PHP_EOL 与 <br> 有何不同?

43

对于大多数交互式网站而言,当我们向Web客户端浏览器输出多行内容时,我认为使用<BR />要比其他两种方式更可取:\nPHP_EOL

否则,我们需要使用"<pre></pre>"来包装输出内容,或者使用nl2br()\n之前插入<BR />,以便多行标记可以在HTML中生效。例如如下示例:

$fruits = array('a'=>'apple', 'b'=>'banana', 'c'=>'cranberry');

// Multiple lines by \n
foreach( $fruits as $key => $value ){
    echo "$key => $value \n" ;
}

// Multiple lines by PHP_EOL
reset( $fruits );
while ( list($key, $value) = each( $fruits ) ){
    echo ("$key => $value" . PHP_EOL);
}

// Multiple lines by <BR />
reset( $fruits );
while ( list($key, $value) = each( $fruits ) ){
    echo ("$key => $value <BR />");
}

有些人认为在编写数据到文件(例如日志文件)时,PHP_EOL很有用。它会在任何平台上创建换行符。

那么,当我们使用\n时呢?\nPHP_EOL以及<BR />之间有什么区别?是否有人可以列出它们的优缺点的大列表?


1
这与主题无关,但您可以通过简单地使用 foreach($fruits as $key => $value) 实现与您构造的 while 相同的效果。这样,您也不必执行 reset($fruits) - kba
关于 \n 和 PHP_EOL 的区别,请参考:http://de2.php.net/manual/en/reserved.constants.php 而 <br> 与简单文本文件中的换行符有着完全不同的上下文。 - CBroe
3
(1) 如果您保证在Unix/Linux上,并且不处于HTML模式下,请使用"\n"。(2) 如果您不处于HTML模式下,请使用PHP_EOL。(3) 如果您明确并确定要输出HTML,请使用"<br>"。(4) 如果您不确定是否需要HTML,则稍后使用nl2br()更容易,以后再删除"<br>"。(5) 实际上,如果输出格式尚未确定,则应该_不输出任何内容_,这意味着您最好返回带有不确定分隔符的数组而不是字符串,将决定如何分隔字符串推迟到您_知道_要使用什么为止。 - Wrikken
7个回答

44

DOS、Unix 和 Mac(pre-OS X 和 OS X)使用不同的字符或字符组合来表示“换行”。

  • DOS - 使用 CR+LF(即 ASCII 13 后跟 ASCII 10,或 \r\n)表示新行。

  • Unix - 使用 LF(即 ASCII 10,或 \n)表示新行。

  • Mac(pre-OS X)- 使用 CR(即 ASCII 13,或 \r)表示新行。

  • Mac(OS X)- 像 Unix 一样,使用 LF 表示新行。

因此,何时使用每个字符取决于你的目的。如果你要为特定平台编写代码且不打算进行移植,则使用对该平台有用的字符或字符组合来换行。 PHP_EOL 的目的是自动选择正确的字符以使新行与平台无关。

所有这些在浏览器中均显示为单个空格,因为浏览器将空格折叠成一个显示空间(除非您使用了像 <pre> 这样的标签,或者使用更改空格行为的 CSS 样式)。这就是你提到的 <br> 的作用,它会将这些 \n 换行字符转换为 <br>,以便在 HTML 显示中提供换行。


我认为Nick的答案最好地列出了不同平台上的不同换行符,并指出了在浏览器中折叠的空白字符及其解决方案。但仍然感谢kba和m59,他们的答案仍然值得肯定。 - John Yin
你可以始终使用类似 sprintf("%c",10); 的方式来表示 ASCII 换行符,我相信这在每个系统上都是通用的。 - clockw0rk

12

<br>

<br>只应用于分隔文本。您可能会看到它用于在html文档中间隔元素,但那不是它的目的,因为布局间距应使用CSS(例如margin)实现。这里有一个不错的使用案例:

<p>This <br> is <br> some <br> text.</p>

为了提高可读性,我通常使用换行符将文本分段,但不希望在文档中渲染出这些换行符。因此,<br>标签是必要的。

CSS空白符和<pre>

<pre>元素是一个元素,它默认使用CSS规则white-space: pre;,以便文档中的空白符在该元素内呈现。通常,无论文档中有多少空格,只会呈现一个空格。这种样式非常适合用于代码块。如果我编写一个代码块,自然会按照自己的意愿进行间距,并且不需要在每一行周围包裹<p>标签(这也不符合语义),我也不想在代码中插入<br>。更糟糕的是,还有代码缩进!在这里使用whitespace:pre是非常合理的。

<pre>
function foo() {
  //etc
}
</pre>

\r, \n, PHP_EOL

根据您的PHP代码所运行的平台,您需要使用\r\n\或两者兼备的\r\n来渲染换行。使用PHP_EOL将自动为您选择,因此它是最灵活的方法。


同时,当您从PHP文件向CMD执行echos时,PHP_EOL也可以使用。 - CristianS9

6
与实际文本换行不同,HTML的换行标签<br>只是网站在浏览器渲染时的换行,\nPHP_EOL才是真正的源代码换行。正如你所提到的,PHP_EOL可以在任何平台上使用,因此也比\n更受欢迎。最初,\n只是UNIX上的标准换行符,而Macintosh使用\r,Windows/DOS则使用两者的组合:\r\n。然而,使用PHP_EOL后,你根本不用担心平台问题。现在,大多数系统和编辑器都能容忍您决定使用的任何换行符,但使用正确的换行符显然是首选,使用PHP_EOL最易于实现这一点,因此没有理由不使用它。

当你考虑到 CSS 中的 whitespace,比如 <pre> 标签时,情况就不一样了。 - m59

3

我需要在cron上运行脚本并将结果保存到日志文件中。但有时我也会在浏览器上运行该脚本。为了使用正确的换行符,我进行以下测试:

<?php
$eol = (isset($_SERVER['SHELL'])) ? PHP_EOL : "<br />";
echo "DISCOVER". $eol;
?>

1
非常简单的答案:
  • <body> 内容中使用 '<br/>'.PHP_EOL,否则不会对输出页面产生任何影响;
  • 在每行的末尾使用 PHP_EOL,但要在 <body> 外部并在 <script> 中使用,该脚本位于 body 内部;
  • 在需要输出分隔行的 string 中间使用 \
这些规则将输出一个带有空行的 HTML 页面,并且同时适合开发人员检查您的 HTML 代码。

0
你可以使用Flavio的代码创建一个函数,它总是设置正确的换行符,无论你是在shell还是浏览器中运行它:
<?php
function nl($string) {
  if(isset($_SERVER['SHELL'])) return preg_replace('/\<br(\s*)?\/?\>/i', PHP_EOL, $string);
  return nl2br($string);
}


print nl("One\nTwo<br>Three\r\nFour<br />Five
Six" . PHP_EOL);
?>

0
它是为了HTML设计而创建的... <br> 在许多地方都不起作用,直到它支持内容类型为<HTML>
在邮件函数中的示例1,其中内容类型为文本... <br> 不起作用,但/n会起作用。
更多示例,您将看到不同的结果。
示例2
<html>
<body>
<script>
document.write("Hello \n World!");
</script>
 </body>
</html>

由于 document.write 写入 DOM,您需要使用
进行换行。 相关 MDN 文档

示例3

txt = "Hello \n World!" ; 
alert(txt);

因为alert函数要求向用户显示消息,它与包含HTML的弹出窗口不同。

/n

在大多数编程语言中,\n基本上是用于换行的,并且可以在大多数平台上使用。 \nPHP_EOL是实际的源代码换行符。

常量PHP_EOL通常用于特定于平台的输出。

主要用于文件输出。实际上,文件函数已经在Windows系统上将\n ←→ \r\n进行了转换,除非在fopen(…, "wb")二进制模式下使用。

但是,对于文件输入,您应该优先选择\n。虽然大多数网络协议(HTTP)应该使用\r\n,但这并不保证。

因此,最好在\n上进行分割,并手动删除任何可选的\r

示例

$lines = array_map("rtrim", explode("\n", $content));

更健壮和简洁的替代方法是使用 preg_split() 和正则表达式:
$lines = preg_split("/\R/", $content);

\R 占位符可以检测到任何组合的 \r + \n。因此,这是最安全的方法,即使对于经典的 MacOS ≤ 9 文本文件也适用(实际上很少见)。

请注意,旧版 Mac 使用 \r,此解决方案更好:preg_replace('〜\r\n?〜',"\n",$str);

PHP_EOL

在编写输出日志文件等输出时应使用它。

它将产生特定于您平台的换行符。

它是一个常量,保存服务器平台使用的换行符。在Windows的情况下,它是 \r\n。在*nix上,它是\n。您显然有一个Windows服务器。


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