PHP добавляет дополнительные пробелы по требованию

Рассмотрим следующий код:

<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 добавляет пробелы над каждым элементом, отталкивая его, идентифицируя как пустой текстовый узел в инструменте Inspect Element Chrome (пробелы исчезают при удалении этого узла)

Удаление всех ненужных пробелов из скрипта боковой панели (что делает его одной строкой кода) не исправляет его. И если я просто заменю строки require_once содержимым компонентов, пробелы не появятся. Поэтому не уверен, почему PHP добавляет его в require. Есть идеи?

Обновить

Это все еще кажется странным. Теперь я согласен, что require_once не является основной причиной как таковой. Я решил некоторое время игнорировать проблему и надеюсь, что это исчезнет после того, как я буду работать над этим дальше. Увы, это остается, поэтому я немного расследовал. Проверка источника страницы в браузере подтверждает, что рассматриваемый код действительно возвращается как одна длинная непрерывная строка. Http://pastebin.com/dtp7QNbs . Пробел или возврат каретки между любыми тегами отсутствуют, но в браузере появляется пробел. – идентифицируется в инструменте Inspect Element как пустые строки между каждым <div class="component">

Означает ли это, что облегчает проблему?

У меня была та же проблема и было проверено решение Kai изменить формат ANSI, но также обнаружил, что также работает «Encode in UTF-8 без спецификации». Это появляется как формат по умолчанию для новых файлов Notepad ++ PHP, поэтому один шаг перехода.

Похоже, что использование заголовка файла метки байтового байта в UTF-8 обычно не рекомендуется. Я подтвердил, что моя установка VS2010 добавляла спецификацию при сохранении файлов PHP.

Следующая статья stackoverflow прекрасно объясняет, куда вставили лишние пробелы.

В чем разница между utf-8 и utf-8 без спецификации?

Задача решена! Это потребовалось навсегда, чтобы понять. Короткий ответ заключается в том, что мои php-файлы кодировались в кодировке UTF-8. Изменение этого в Notepad ++ на ANSI исправило его.

Я только нашел реальную причину проблемы, выполнив сравнение по образцу выходного HTML – один вывод, из которого был использован «require_once», и тот, где код был вставлен вручную на месте.

При визуальном сравнении выхода оба они выглядели одинаково – одинаковая длина, без дополнительных / разных символов. Но когда проталкивается через preg_split('//', $string) и зацикливается через символ по символу, в начале каждой точки вставки require_once были обнаружены 3 дополнительных «невидимых» символа. Я обозначил их как символы ASCII &#239; , &#187; и &#191; (двуточечный i, правый шеврон и перевернутый вопросительный знак).

Изменено кодирование в ANSI (я обнаружил это как причину, когда я воссоздал один из сценариев в «Блокноте» дословно, и он не постигла ту же проблему), и лишние строки исчезли.

Дополнительные символы – это спецификация (байтовый заказ). Поэтому преобразование в UTF-8 без спецификации было настоящим трюком. Подробнее здесь: http://en.wikipedia.org/wiki/Byte_order_mark

Сначала поместите <?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> 

некоторое время это произошло из-за пробела после ?> в файле класса, также или до <?php