Как предотвратить использование встроенного оператора <? = Text?> В отображаемом исходном коде? - PullRequest
1 голос
/ 11 сентября 2009

В PHP всякий раз, когда я делаю что-то вроде:

<span>Blah blah HTML</span>
<?= echo $this->foo ?>
<br />

В источнике это выглядит так:

<span>Blah blah HTML</span>
{$this->foo whatever it is}     <br />

Вместо

<span>Blah blah HTML</span>
{$this->foo whatever it is}
<br />

Такие вещи случаются постоянно. Встроенный PHP делает мои новые строки все шаткими, и это беспокоит меня. Это также происходит, когда вы запускаете полный блок PHP в HTML, но держите его в соответствии с вкладками HTML. Например:

<div id="foo">
    <div class="bar">
    <?
        foreach(whatever)
        {
    ?>
    </div>
</div>

испортит форматирование источника, и я должен сделать что-то вроде этого:

<div id="foo">
    <div class="bar">
<?
foreach(whatever)
{
?>
    </div>
</div>

Ответы [ 8 ]

6 голосов
/ 11 сентября 2009

Если вы беспокоитесь о форматировании HTML. Затем вам нужно добавить новую строку.

<span>Blah blah HTML</span>
<?= echo $this->foo."\n" ?>
<br />

Но будьте осторожны, это опасный путь для спуска. Потому что следующая вещь, о которой вы будете беспокоиться, это отступ на вкладке. Тогда вы добавите кучу \t везде. И через некоторое время ваш код выведет чистый и аккуратный html, но станет почти нечитаемым как исходный код.

Итак, мое предложение. Не беспокойся об этом.

2 голосов
/ 11 сентября 2009

Для первого вопроса вы можете просто использовать символ новой строки \ n

Я не уверен насчет второго пункта. Могу я спросить, почему вы беспокоитесь о выведенном html? Если это потому, что вы используете его, чтобы увидеть, что выводится, могу я вас познакомить с firebug? Firebug покажет дерево DOM красивым и чистым для вас (и даже обновит его с помощью инъекций DOM).

1 голос
/ 11 сентября 2009

Точно так же, как вы знаете, <?= на самом деле означает <?php echo. Так что вам нужно всего лишь <?=$username?>

0 голосов
/ 12 сентября 2009

испортит форматирование источника, и я должен сделать что-то вроде этого:

<div id="foo">
    <div class="bar">
<?
foreach(whatever)
{
?>
    </div>
</div>

важно , чтобы исходный код PHP читался, чтобы вы могли легко его поддерживать. совсем не важно , чтобы сделать все отступы красивыми для 0,0001% людей, которые будут "просматривать источники". Приведенный выше фрагмент кода только усложняет вам задачу.

В источнике [HTML] это выглядит так:

<span>Blah blah HTML</span>
{$this->foo whatever it is}     <br />

Это не для меня, новая строка появляется там, где вы ожидаете. Но все равно, кого это волнует? Пока сама разметка верна и компактна, у вас все в порядке.

Посмотрите на пример JimR с использованием PHP в стиле хорошо вложенных начальных и конечных тегов. Это хороший подход к удобству сопровождения, поскольку он поддерживает единую иерархию кода и разметки, а не переключается между вложенными уровнями отступов постоянно.

Для меня это также имеет побочный эффект от предоставления исходного кода HTML с согласованным деревом отступов. В нем больше пустых строк и больше отступов, чем строго необходимо, но опять же, кого это волнует? Дополнительный пробел, делающий файл больше, не проблема; сжатие «на лету», например, mod_deflate, сведет это на нет.

Обратите внимание, что «альтернативный синтаксис», используемый в JimR, необязателен для использования этой техники, он также отлично работает с фигурными скобками и является вопросом личного вкуса, который вы выбираете:

<?php
    $replyn= count($replies);
?>
<?php if ($replyn)==0) {?>
    <p> (no replies.) </p>
<?php } else { ?>
    <h3> Replies </h3>
    <?php for ($i= 0; $i<$replyn; $i++) { ?>
        <p>
            <?php echo(htmlspecialchars($replies[$i], ENT_QUOTES)); ?>
        </p>
    <?php } ?>
<?php } ?>

(Хотя лично я использую функцию быстрого вызова, чтобы не вводить echo(htmlspecialchars)) постоянно. Если вы не используете htmlspecialchars, возможно, у вас проблемы с безопасностью.)

В этом примере используются полные теги <?php для запуска, разрешены ли короткие теги. В конечном счете, хотя я согласен с JimR, что полные теги, как они есть, являются пустой тратой времени.

(Было бы хорошей идеей сделать PHP более совместимым с инструкциями обработки XML, но, поскольку они никогда не использовали способ шаблонирования тегов PHP в значения атрибутов, по-прежнему невозможно создать страницу PHP, которая также сформировал XML, что делает упражнение немного бессмысленным.)

0 голосов
/ 11 сентября 2009

движок PHP заменяет области с кодом PHP ничем (кроме вывода изнутри php), поэтому, когда вы делаете:

<h1>Foo Bar</h1>
<?= $value; ?>
<p>my stuff</p>

php удаляет символ новой строки после?>. Если вы хотите, чтобы эта новая строка «сохранилась», вы можете просто нажать клавишу ввода 2 раза после закрытия?>. Хотя на самом деле, если вам нужно создать вывод HTML, который «читабелен» для человека, вы должны использовать некоторую библиотеку, которая очищает / дезинфицирует / форматирует HTML-код (Tidy был упомянут выше, так что вы можете использовать это).

Что касается ваших проблем с форматированием в PHP и сохранением вкладок, объяснение, которое я только что дал, покрывает его - но если вы хотите сделать более читаемый исходный код (для редактирования), вам следует рассмотреть возможность использования альтернативного синтаксиса PHP для шаблонов (который является продвигается не так хорошо, как следовало бы). Большинство всех структур управления php (for, while, foreach, if, else) имеют альтернативные синтаксические опции, которые выглядят намного красивее в HTML-шаблонах.

<? foreach ($foo as $bar): ?>
    <li>
        <?= $bar['baz']; ?>
    </li>
<? endforeach; ?>

<? if (false == empty($foo)): ?>
    <p>
        Hello World!
    </p>
<? endif; ?>

<? for ($i = 0, $icount = count($foo); $i < $icount; $i++): $val = $foo[ $i ]; ?>

    <tr>
        <td><?= $val; ?></td>
    </tr>

<? endfor; ?>

Кроме того, кто-то выше упомянул, что короткие теги в PHP устарели. Это просто откровенная ложь, http://us.php.net/manual/en/ini.core.php#ini.short-open-tag - все еще живая, бодрая и такая же потрясающая.

Короткие теги делают приведенный выше код более читабельным, чем наличие <?php ?> везде, не говоря уже о том, что это делает возможным <?= ?>. <?= - это сокращение от <?php echo или <? echo - что делает ваш код более читабельным. Тем не менее, следует отметить, что если вы пишете код, который должен быть открытым исходным кодом и используется на множестве различных веб-серверов, вы должны по крайней мере предупредить своих загрузчиков, что вам нужны короткие теги (или включить их с помощью ini_set() или php_flag [in .htaccess])

0 голосов
/ 11 сентября 2009

К сожалению, вы ничего не можете с этим поделать напрямую. Хотя для нас, людей, приятно просматривать исходный код с хорошими отступами, спецификация HTML всегда считала пустое пространство незначительным, и поэтому люди, разрабатывающие системы для работы с HTML, часто не рассматривают добавление функций для детального контроля. Кроме того, PHP стал более гибким благодаря описанному вами поведению. Например, если он использовался для генерации выходных данных, где пробел был БЕЗОПАСНЫ, то поведение, которое вы описали, было бы желательным.

Если вы решили, что исходный код HTML с хорошим отступом важен для вас, вам понадобится установить систему вокруг вывода для обработки форматирования. Вместо того, чтобы выводить напрямую, что-то перехватит ваш вывод и автоматически обработает форматирование для вас. Выходная буферизация - это одна из тех целей, где вы могли бы достичь этого.

ob_start();
//...
//a bunch of code that echos or prints HTML
//...
$output = ob_get_clean();
echo some_function_or_method_call_to_format_your_html_however_you_want($output);

Реализация some_function_or_method_call_to_format_your_html_however_you_want, если оставить ее в качестве упражнения для читателя, хотя функции Tidy в PHP могут быть хорошим местом для начала.

Существуют и другие подходы, например, маршрутизация всего вывода через объект, который по контексту может определить, сколько вкладок или новой строки нужно добавить к выводу. Суть в том, что PHP сам по себе не поможет вам решить эту проблему, но предоставляет инструменты для создания собственного решения.

0 голосов
/ 11 сентября 2009

Если вы хотите, чтобы ваш вывод HTML был красивым, и вы не хотите полагаться на инструменты браузера, такие как firebug, в PHP есть класс под названием Tidy , который сделает свое дело.

ps, короткие теги (<?= ?>) устарели. Возможно, вы захотите переключиться на (<?php ?>)

0 голосов
/ 11 сентября 2009

Просмотр сгенерированного HTML-кода с помощью инструмента , например, Firebug , который автоматически форматирует .

После установки Firebug просто нажмите клавишу F12 и выберите вкладку HTML. Вы можете перемещаться по источнику HTML, используя древовидный элемент управления, который довольно печатает разметку.

Вы можете использовать Firebug Lite , если вы разрабатываете в браузере, отличном от Firefox. Просто вставьте фрагмент HTML-кода с веб-страницы Firebug Lite на свой сайт.

Имейте в виду, что устранение посторонних пробелов может улучшить производительность вашего сайта, поэтому «минимизировать» HTML не обязательно плохо.

...