【问题标题】:PHP adds extra whitespace on requirePHP 在 require 上添加了额外的空格
【发布时间】:2013-01-26 17:55:48
【问题描述】:

考虑以下代码:

<div id="sidebar">
<?php
  require_once('/components/search.php');
  require_once('/components/categories.php');
?>
</div>

search.phpcategory.php 本质上是相同的结构——一个包含一些特定内容的 div 容器。这里没什么特别的,纯 HTML:

<div class="component">
<!-- blah -->
</div>

但是,当使用require_once(或require / include 等)插入时,PHP 在每个元素上方添加空格,将其向下推,在 Chrome 的 Inspect Element 工具中可识别为空文本节点(空格消失时此节点已删除)

从侧边栏脚本中删除所有不必要的空格(使其成为单行代码)并不能解决此问题。如果我只是将 require_once 行替换为组件的内容,则不会出现空格。所以不知道为什么 PHP 在 require 上添加它。有什么想法吗?

更新

这个仍然被证明是一个奇怪的。我现在同意require_once 似乎不是根本原因。我决定暂时忽略这个问题,并希望在我进一步研究后它会消失。唉,它仍然存在,所以我做了更多的调查。检查浏览器中的页面源代码确认有问题的代码确实作为一条完整的长行返回http://pastebin.com/dtp7QNbs - 任何标签之间没有空格或回车,但浏览器中出现空格 - 可在 Inspect 元素中识别工具作为每个&lt;div class="component"&gt;之间的空行

这是否有助于进一步阐明问题?

【问题讨论】:

  • 我非常怀疑require_once 是否添加了空格。您应该查看正在包含的文件,看看最后是否有任何内容。
  • require 语句放在一行中:&lt;?php require_once('/components/search.php'); require_once('/components/categories.php'); ?&gt; 并删除 PHP 结束标记后的所有尾随空格。
  • 删除任何尾随 ?> 在您包含的每个文件的末尾
  • @njk 包含的内容与粘贴的内容完全相同 - 一直到&lt;!--blah--&gt;(我想检查内容是否以某种方式添加了它)。 @BenM 做到了(见倒数第三行)。空白仍然存在 @MarkBaker search.phpcategories.php 目前是纯 HTML,所以没有 ?> 要删除
  • 那么这是一个样式问题,而不是PHP 问题。

标签: php whitespace require-once


【解决方案1】:

我遇到了同样的问题,并验证了 Kai 将格式更改为 ANSI 的解决方案,但也发现“在没有 BOM 的情况下以 UTF-8 编码”也可以。 这是新 Notepad++ PHP 文件的默认格式,因此可以减少一个转换步骤。

似乎一般不推荐使用 UTF-8 中的字节顺序标记文件头。我验证了我安装的 VS2010 在保存 PHP 文件时添加了 BOM。

下面的 stackoverflow 文章很好地解释了插入额外空格的位置。

What's different between utf-8 and utf-8 without BOM?

【讨论】:

    【解决方案2】:

    问题解决了!这花了很长时间才弄清楚。简短的回答是我的 php 文件是 UTF-8 编码的。在 Notepad++ 中将其更改为 ANSI 已修复。

    我只是通过逐个字符比较输出 HTML 找到问题的真正原因 - 一个输出来自使用“require_once”的地方,另一个来自手动粘贴代码的地方。

    在输出的视觉比较中,两者看起来相同 - 长度相同,没有额外/不同的字符。但是当通过preg_split('//', $string) 并逐个字符循环时,在每个require_once 插入点的开头显示了3 个额外的“不可见”字符。我将它们标识为 ASCII 字符 &amp;#239;&amp;#187;&amp;#191;(双点 i、右 V 形和倒置问号)。

    将编码更改为 ANSI(当我在记事本中逐字逐句地重新创建一个脚本时,我发现这是原因,它没有遇到同样的问题),多余的行已经消失了。

    【讨论】:

      【解决方案3】:

      额外的字符是 BOM(字节顺序标记)。因此,在没有 BOM 的情况下转换为 UTF-8 才是真正的诀窍。更多信息在这里:http://en.wikipedia.org/wiki/Byte_order_mark

      【讨论】:

        【解决方案4】:

        由于类文件中?&gt; 之后,&lt;?php 之前或之前的空白,有时会发生这种情况

        【讨论】:

        • 是的,你是对的,我不知道为什么有人标记你。我花了很长时间想知道我的项目的一部分空白是从哪里来的。我已经发送了标头,并且某个地方的空格破坏了它。原来在我包含的文件中关闭 ?> 后有空格 - 甚至文档也暗示了这一点。所以谢谢!
        【解决方案5】:

        首先,将&lt;?php 与 DIV 放在同一行:

        <div id="sidebar"><?php
        

        这消除了search.php之前的空白。

        然后确保search.php 末尾没有换行符,这会导致search.phpcategories.php 之间出现空格。一些文本编辑器默认添加尾随换行符,您可能需要覆盖它。

        我刚试过这个,php main.php 的输出是:

        <div id="sidebar"><div class="component">
        <!-- search.php -->
        </div><div class="component">
        <!-- categories.php -->
        </div></div>
        

        【讨论】:

        • 试过这个,(见最后一段)。据我所知,没有任何尾随空格 - 文件是用 Notepad++ 编写的,在记事本中检查过,没有多余的空间可以找到
        • 我在 Mac 上,我使用 Emacs,并在写入文件之前将 require-final-newline 设置为 nil。不知道如何在 Notepad++ 中执行此操作。
        【解决方案6】:

        在程序员的记事本编辑器中使用以下方法很容易将 PHP 文件保存为 UTF-8 不带标记符号

        1. 文件 -> 编码 -> UTF-8 无标记
        2. 文件 -> 保存

        之后require 命令将包含 PHP 脚本而不添加空格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-29
          • 2011-06-15
          • 1970-01-01
          • 2011-06-01
          相关资源
          最近更新 更多