考虑以下代码:
<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">
之间的空行
这有助于进一步阐明这个问题吗?
我遇到了同样的问题,验证了 Kai 的解决方案,将格式更改为 ANSI,但也发现“Encode in UTF-8 without BOM”也有效。 这是新的 Notepad++ PHP 文件的默认格式,因此可以少一个转换步骤。
似乎一般不建议使用UTF-8 中的字节顺序标记文件头。我验证了我安装的VS2010在保存PHP文件时添加了BOM。
以下 stackoverflow 文章很好地解释了额外空格插入的位置。
问题解决了!这花了很长时间才弄清楚。简短的回答是我的 php 文件是 UTF-8 编码的。在 Notepad++ 中将其更改为 ANSI 修复了它。
我只是通过对输出 HTML 进行逐字符比较才找到问题的真正原因 - 一个输出来自使用“require_once”的位置,另一个输出来自手动粘贴代码的位置。
在输出的视觉比较中,两者看起来相同 - 长度相同,没有额外/不同的字符。但是,当推入
preg_split('//', $string)
并逐个字符循环时,在每个 require_once
插入点的开头会显示 3 个额外的“不可见”字符。我将它们识别为 ASCII 字符 ï
、»
和 ¿
(双点 i、右 V 形和倒置问号)。
将编码更改为 ANSI(当我在记事本中逐字重新创建脚本之一时发现这是原因,并且它没有遇到相同的问题),并且多余的行已经消失。
额外的字符是BOM(字节顺序标记)。因此,转换为无 BOM 的 UTF-8 才是真正的技巧。更多信息在这里:http://en.wikipedia.org/wiki/Byte_order_mark
有时会发生这种情况,因为类文件中
?>
之后、<?php
之前或之前有空格
在程序员的记事本编辑器中使用以下方法可以轻松将 PHP 文件另存为 UTF-8,不带标记符号:
之后
require
命令将包含 PHP 脚本而不添加空格。
首先,将
<?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>
同样的问题,我的解决方法是更正目录... 从
include_once 'connection.php';
到 include_once './connection/connection.php';