2013-02-11 49 views
1

考虑下面的代码:PHP增加了额外的空格上需要

<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的检查元素工具的空白文本节点(删除此节点时,空白字符消失)

从侧边栏脚本中删除所有不必要的空格(使其成为一行代码)不会修复它。如果我只是将require_once行替换为组件的内容,则不显示空白。所以不知道为什么PHP会根据需要添加它。有任何想法吗?

更新

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

这是否有助于揭示这个问题?

+0

之前,我高度怀疑'require_once'被添加空格。您应该查看正在包含的文件,并查看最后是否有任何结尾。 – Kermit 2013-02-11 15:37:52

+0

将'require'语句放在一行中:'<?php require_once('/ components/search.php'); require_once( '/部件/ categories.php'); ?>并在关闭PHP标记后删除任何尾随空格。 – BenM 2013-02-11 15:38:02

+1

删除每个包含文件末尾的?> – 2013-02-11 15:38:03

回答

2

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

我只通过对输出HTML进行逐字符比较发现问题的真正原因 - 使用'require_once'的地方的一个输出,以及代码手动粘贴到位的地方。

在一个视觉比较的输出,都显示相同 - 长度相同,没有额外/不同的字符。但是当穿过preg_split('//', $string)并且逐个字符地循环时,在每个require_once插入点的开始处显露出3个额外的“不可见”字符。我将它们识别为ASCII字符&#239;,&#187;&#191;(双点i,右人字形和倒置问号)。

将编码更改为ANSI(我发现这是因为当我在记事本中逐字重新创建其中一个脚本时,它没有遭遇同样的问题),并且多余的线条消失了。

0

首先,把<?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> 
+0

试过这个,(见最后一段)。目前为止我还没有看到任何尾随的空格 - 文件是用Notepad ++编写的,在记事本中检查过,没有额外的空间可供查找 – Kai 2013-02-11 16:12:33

+0

适用于我,请参阅更新。 – Barmar 2013-02-11 16:18:24

+0

我在Mac上使用Emacs,并在写入文件之前将'require-final-newline'设置为零。不知道如何在Notepad ++中执行此操作。 – Barmar 2013-02-11 16:20:15

3

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

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

下面的stackoverflow文章很好地解释了额外的空白插入的地方。

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

0

一段时间,它的发生是因为白色的空间?>后的类文件,也或<?php

+1

是的你是对的,我不知道为什么有人给你打了个电话。我花了很长一段时间想知道我的项目的一部分来自哪里。我已经发送了头文件,并且有空白处被打破。原来在关闭后有空格?>在我包含的文件中 - 甚至是文档提示。那谢谢啦 ! – Rog 2017-07-03 01:19:58