Возможно ли автоматическое создание отступа в исходном HTML-коде, выводимом PHP?

Как перфекционист, мне нравится иметь корректный HTML-код с правильным отступом, выводимый PHP.

У меня есть несколько сложных веб-приложений для ИТ-пользователей, и им нравится иметь возможность просматривать исходный код и не видеть беспорядка.

В настоящее время я использую эту функцию, которую я написал:

function nl($tabs = 0)
{
    return "\r\n" . str_repeat("\t", $tabs);
}

Используя его так, чтобы добавить новую строку и необходимое количество вкладок:

if(array_key_exists('field', $row)){
    echo '<td>' . $row['field'] . '</td>' . nl(4);
}

Есть ли что-нибудь встроенное в PHP или есть класс, который я могу использовать для автоматического выполнения этого отступа?


person Danny Beckett    schedule 06.07.2014    source источник
comment
Раньше создание читаемого HTML было задачей писателя, теперь это делается автоматически браузерами с помощью таких инструментов, как Firebug или инструменты разработчика Chrome. Вам следует сосредоточиться на том, чтобы ваш PHP был читабельным, а не на выводе (HTML).   -  person Joren    schedule 06.07.2014
comment
@panther Trollololol, потому что Linux по-прежнему является королем Интернета (и без лицензионных сборов). Я использую .NET там, где это требуется / требуется, но обычно это требуется с открытым исходным кодом.   -  person Danny Beckett    schedule 06.07.2014
comment
@DannyBeckett: В вашем браузере нет кнопки prettify для исходного кода? это избавляет от необходимости писать все эти бессмысленные (а в вашем случае ошибочные) функции отступов. Под ошибочным я подразумеваю, например, каким return "\r\n" должно быть return PHP_EOL   -  person Elias Van Ootegem    schedule 06.07.2014
comment
Я бы не стал этого делать, но вы можете собрать свой html в переменной (или с помощью output_buffering) и проанализировать его перед повторением.   -  person hellcode    schedule 06.07.2014
comment
Может быть, вы сможете написать такие функции, как openTag, closeTag и writeContent. Первые два могут увеличивать и уменьшать счетчик отступов. Но для этого потребуется много дополнительных вызовов функций, что может привести к немного медленному отображению страницы. Кроме того, не все теги HTML (в отличие от XML) нужно закрывать, так что это может испортить отступ.   -  person GolezTrol    schedule 06.07.2014
comment
@DannyBeckett «Мне нравится, когда мой HTML читается». Окончательный внешний вид не должен быть аспектом этого совершенства. Да, есть отличный ответ - за который я проголосовал - который объясняет, как использовать DOMDocument для достижения этой цели, но любое воспринимаемое «совершенство» в форматировании будет происходить за счет снижения общей производительности кода. Вы хотите такого «совершенства»? Хорошо отрисованный HTML на сервере, который замедляется, чтобы приспособиться к этому? Если бы я был на вашем месте, я бы сделал ваш окончательный HTML-код совместимым и хорошим, чтобы он правильно проверялся в валидаторе. Помимо этого, отступы - пустая трата времени.   -  person Giacomo1968    schedule 06.07.2014
comment
@DannyBeckett Достаточно честно. Я бы порекомендовал вам кэшировать окончательный HTML-код, чтобы весь DOMDocument процесс запускался только время от времени.   -  person Giacomo1968    schedule 06.07.2014
comment
Некоторое время назад было что-то об автоматическом отступе с помощью javaScript и CSS.   -  person a coder    schedule 06.07.2014
comment
@DannyBeckett, они пытались делать что-то с пикселями, с отступом от того, как в старомодных газетах делали L / C / R выравнивание заголовков историй.   -  person a coder    schedule 06.07.2014
comment
@IGotRoot Скорее всего, не для просмотра исходного кода. Мне было бы интересно, если бы вы могли найти ссылку?   -  person Danny Beckett    schedule 06.07.2014
comment
@IGotRoot Как я и ожидал, не для просмотра исходного кода.   -  person Danny Beckett    schedule 06.07.2014


Ответы (1)


При использовании буферов вывода вы можете использовать DOMDocument и установить для formatOutput значение true перед сбросом буферов в клиент / браузер.

ie:

libxml_use_internal_errors( TRUE );

$dom = new DOMDocument();
$dom->validateOnParse = FALSE;
$dom->preserveWhiteSpace = TRUE;
$dom->formatOutput = TRUE;
$om->loadHTML( mb_convert_encoding( ob_get_contents(), 'UTF-8' ) );

libxml_clear_errors();

/*
 perform any other operations on dom elements you wish
*/

$buffer = $dom->saveHTML();
ob_end_clean();
echo trim( $buffer );/* send data to client/browser */
person Professor Abronsius    schedule 06.07.2014
comment
Хороший ответ. Плохая идея. - person Sverri M. Olsen; 06.07.2014
comment
@ SverriM.Olsen Это конкретное веб-приложение в значительной степени основано на данных, и возможность просмотра источника (читаемого) иногда бывает очень полезной. - person Danny Beckett; 06.07.2014
comment
@DannyBeckett Форматирование вывода служит только для замедления работы веб-сайта. Это не мое дело, но вы можете хотя бы сделать это необязательным. Можно использовать переменную GET в качестве переключателя, например ?format_output=true. - person Sverri M. Olsen; 06.07.2014
comment
@ SverriM.Olsen Это хорошая идея. У ИТ-персонала в любом случае установлена ​​особая переменная сеанса, отличная от сотрудников других рабочих единиц. - person Danny Beckett; 06.07.2014
comment
@RamRaider использует принцип KISS и принимает его на стороне клиента с помощью одной строчки кода. - person a coder; 06.07.2014
comment
@IGotRoot Мне не нужно решение на стороне клиента. - person Danny Beckett; 07.07.2014