请考虑以下代码:
<div id="sidebar">
<?php
require_once('/components/search.php');
require_once('/components/categories.php');
?>
</div>
search.php
和category.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 - 任何标记之间没有空格或回车符,但浏览器中出现空格 - 可在将元素工具检查为每个<div class="component">
这有助于解决这个问题吗?
答案 0 :(得分:4)
我遇到了同样的问题,并验证了Kai的解决方案,将格式更改为ANSI,但也发现“没有BOM的UTF-8编码”也有效。 这是新Notepad ++ PHP文件的默认格式,因此转换步骤少一些。
似乎通常不推荐使用UTF-8中的字节顺序标记文件头。我确认我的VS2010安装在保存PHP文件时添加了BOM。
以下stackoverflow文章很好地解释了插入额外空格的位置。
答案 1 :(得分:2)
问题解决了!这需要永远弄明白。简短的回答是我的php文件是UTF-8编码的。在Notepad ++中将其更改为ANSI修复它。
我只是通过对输出HTML进行逐字符比较找到了问题的真正原因 - 使用了'require_once'的输出和手动粘贴代码的输出。
在输出的 visual 比较中,两者看起来完全相同 - 长度相同,没有额外/不同的字符。但是当通过preg_split('//', $string)
推送并逐个字符循环时,在每个require_once
插入点的开头显示了3个额外的“不可见”字符。我将它们标识为ASCII字符ï
,»
和¿
(双点i,右V形和倒置问号)。
将编码更改为ANSI(当我在记事本中逐字逐句重新创建其中一个脚本并且它没有遇到相同的问题时,我发现这是原因)并且额外的行已经消失了。
答案 2 :(得分:2)
额外字符是BOM(字节顺序标记)。因此,在没有BOM的情况下转换为UTF-8是真正的诀窍。更多信息:http://en.wikipedia.org/wiki/Byte_order_mark
答案 3 :(得分:0)
首先,将<?php
放在与DIV相同的行上:
<div id="sidebar"><?php
这摆脱了search.php
之前的空白。
然后确保search.php
最后没有换行符,这会导致search.php
和categories.php
之间的空格。默认情况下,某些文本编辑器会添加尾随换行符,您可能需要覆盖它。
我刚试过这个,php main.php
的输出是:
<div id="sidebar"><div class="component">
<!-- search.php -->
</div><div class="component">
<!-- categories.php -->
</div></div>
答案 4 :(得分:0)
有些时候是因为类文件?>
之后的空白,也是<?php