【问题标题】:PHP eats linefeed in php/plaintext mixed modePHP 在 php/plaintext 混合模式下吃掉换行符
【发布时间】:2013-01-23 15:05:35
【问题描述】:

这个问题困扰了我一段时间。假设我们有一个简单的 PHP 文件:

Line 0
Line 1
<?="Line 2"?>
Line 3

处理此文件将导致:

Line 0
Line 1
Line 2Line 3

?&gt; 之后的换行符去哪了?在结束标记后放置一些字符(例如?&gt;.)时,换行符不会被吞噬。

有没有办法控制这种行为?我不愿意在结束标记之后放置空格,因为我的 IDE 配置为在换行符之前删除空格(我喜欢这样)。

【问题讨论】:

  • 不要使用HTML模式生成文本文件;这是自找麻烦:)
  • 添加一个额外的换行符当然可以,但我宁愿 PHP 省去我的第一个。

标签: php text


【解决方案1】:

是的,确实:

块的结束标记将包括紧随其后的换行符(如果存在)。

http://php.net/manual/en/language.basic-syntax.instruction-separation.php

意思是,如果?&gt; 是该行的最后一件事,则换行符将作为关闭 PHP 块的一部分被删除。您需要明确地echo 一个换行符或添加一个额外的换行符。

【讨论】:

  • 这种行为对我来说没有意义。为什么会有人想要这个?总有一天应该有办法关掉它:-/
  • @Felix 一些代码块不会产生输出,而且您不一定希望它们到处乱扔换行符;说&lt;?php foreach ($foo as $bar) : ?&gt;。是的,PHP 所做的并不是一个很好的解决方案。 Ruby 和其他的 ERB 具有 空格控制,例如-%&gt;- 控制后面换行符/空格的输出或不输出)。 PHP 应该添加它。
  • 哈,感谢 Ruby 的参考,其实我在 20 年前学习的时候还以为这是 PHP 的一部分,但后来我确实遇到了 Ruby。
【解决方案2】:

这个is actually a feature(信不信由你)。如果直接跟在 PHP 结束标记之后,PHP 会使用换行符:

块的结束标记将包括紧随其后的 如果存在换行符。

这很明显是为了让以空行结尾的 PHP 文件不会导致在来自另一个脚本的included 时出现换行符。因此,在可预见的未来,这确实是一个“保护无知”的功能。

如果你真的想要换行符,还有其他选择:从简单地在结束标记后添加 两个 换行符(第二个可以工作!)到在代码中回显换行符。

【讨论】:

    【解决方案3】:

    &lt;?php?&gt; 标记之外,PHP 解释器在 HTML 模式下运行,HTML 模式内的间距问题比文本内容更小。

    要使用 PHP 生成文本,您应该使用纯字符串并以这种方式构建输出:

    $var = "Line 2";
    $s = "Line 0\nLine 1\n$var\nLine3";
    

    至少这不会让你讨厌,虽然documented,惊喜:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多