Рассмотрим следующий код:
<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 ï
, »
и ¿
(двуточечный 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