2013-02-11 3 views
1

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

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

Update

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

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

+0

Я очень сомневаюсь, что 'require_once' добавляет пустое пространство. Вы должны посмотреть на файлы, которые включены, и посмотреть, есть ли что-нибудь в конце. – Kermit

+0

Поместите операторы 'require' в одну строку:' 'и удалите любое конечное пространство после закрытия PHP-тега. – BenM

+1

Удалите любые завершающие?> В конце каждого из ваших включенных файлов. –

ответ

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.php и categories.php. Некоторые текстовые редакторы по умолчанию добавляют конечную новую строку, вам может потребоваться переопределить это.

Я просто попытался это, выход php main.php является:

<div id="sidebar"><div class="component"> 
<!-- search.php --> 
</div><div class="component"> 
<!-- categories.php --> 
</div></div> 
+0

Пробовал это, (см. последний абзац). Я не могу сказать ни одного конечного пробела: файлы написаны в Notepad ++, проверили их в «Блокноте», нет лишнего места для поиска – Kai

+0

Работает для меня, см. Обновление. – Barmar

+0

Я нахожусь на Mac, я использовал Emacs и задал 'require-final-newline' значение nil перед записью файла. Не знаю, как это сделать в Notepad ++. – Barmar

3

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

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

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

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

2

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

0

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

+1

Да, вы правы, я не знаю, почему кто-то вас пометил. Я потратил немало времени на то, чтобы спросить, откуда уходит пустое пространство для части моего проекта. Я отправил заголовки, и где-то пробило его. Оказывается, были пробелы после закрытия?> В файле, в который я включал, - даже документы на это намекают. Так что спасибо ! – Rog

Смежные вопросы