Есть ли лучший способ писать строки HTML в PHP? - PullRequest
18 голосов
/ 22 декабря 2010

Я пишу множество функций в PHP, которые возвращают HTML-код. Они могут выглядеть примерно так:

function html_site_head()
{
    return
        "
            <div id=\"site_header\">
                <div id=\"site_header_inner\">
                    <div id=\"site_header_logo\"></div>

                    <div id=\"site_header_countdown\">BARE XX DAGER IGJEN</div>
                </div>
            </div>
        ";
}

Теперь я могу поклясться, что видел лучшие способы написания длинных строк на PHP. Мне нравится способ Python сделать это:

return """
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>
"""

Так как вам не нужно избегать кавычек. Альтернативой является использование одинарных кавычек, но это означает, что нельзя использовать переменные PHP непосредственно в строке. Клянусь, я видел нечто подобное в PHP:

return <<<
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>

Или что-то подобное. Может ли кто-нибудь освежить мою память об этом?

Спасибо

Ответы [ 9 ]

17 голосов
/ 22 декабря 2010

PHP знает несколько типов синтаксиса для объявления строки :

Так что вам не нужно использовать двойные кавычки как таковые.

11 голосов
/ 10 октября 2014

Если вам нужен метод, который можно использовать для хранения HTML в строке, это способ сделать это.

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

Если вы используете выходной буфер, как я сделал ...

При использовании IDE вы по-прежнему можете получить отличную справку Intelisense по HTML и PHP отдельно друг от друга и быстро кодировать универсальные объекты DOM.

При просмотре кода он выглядит более читабельным.

HTML-код можно передавать в состоянии готовности DOM, а не в виде строки, которую в конечном итоге необходимо будет проанализировать и в конечном итоге превратить в состояние готовности DOM.

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

Я бы использовал поток буфера вывода вот так ...

ob_start();
?>
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"><?php echo $PhpVar; ?></div>
            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>
<?php
$output = ob_get_clean();
ob_flush();

return $output; OR return echo $output
7 голосов
/ 22 декабря 2010

Это называется синтаксис heredoc :

return <<< END
<div id="site_header">
<div id="site_header_inner">
<div id="site_header_logo"></div>    
<div id="site_header_countdown">BARE XX DAGER IGJEN</div>
</div>
</div>
END;
2 голосов
/ 22 декабря 2010

Лучше - не пишите спагетти-код, используйте шаблон или

// php code
?>
<div id="site_header">
    <div id="site_header_inner">
        <div id="site_header_logo"><?=$echoPhpVar?></div>
        <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
    </div>
</div>
<?php
//php code
1 голос
/ 11 июля 2015

Иногда по какой-то причине случается, что PHP или Javascript или какая-то непослушная вставка часто вызывают обратную косую черту.Обычная функция этого не замечает.Поэтому необходимо, чтобы бит «надулся»:

<?php
function removeslashes($string)
{
    $string=implode("",explode("\\",$string));
    return stripslashes(trim($string));
}

/* Example */

$text="My dog don\\\\\\\\\\\\\\\\'t like the postman!";
echo removeslashes($text);
?>

RESULT: My dog don't like the postman!

Этот щелчок мне очень помог, потому что у меня была эта проблема раньше.

Источник: здесь

1 голос
/ 22 декабря 2010

Вы можете использовать HEREDOC:

<?php

function blah() {
  $bar = <<<EOS
  <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
  </div>
EOS;

return $bar;
}

?>
1 голос
/ 22 декабря 2010

То, что вы ищете, это синтаксис heredoc или синтаксис nowdoc .

0 голосов
/ 15 января 2013

Я хотел бы предложить эту библиотеку PHP, которая может обрабатывать генерирование практически любого HTML-тега с помощью php и использует вложение замыкания, что также способствует удобочитаемости.

https://github.com/raftalks/Form

например - таблица внутри тега div

Html::make('div', function($html))
{
    $html->table(function($table)
    {
        $table->thead(function($table)
        {
            $table->tr(function($tr)
            {
                $tr->th('item');
                $tr->th('category');
            });
        });


        $table->tr(function($tr)
        {   
            $tr->td()->ng_bind('item.name','ng-bind');
            $tr->td()->ng_bind('item.category','ng-bind');

            $tr->setNgRepeat('item in list','ng-repeat'); //using second parameter to force the attribute name.
        });

        $table->setClass('table');
    });

   $html->setClass('tableContainer');
});
0 голосов
/ 22 декабря 2010

Как сказал Хаим - heredoc - это путь.

Если вы пишете отдельные строки, помните (или понимайте), что вы можете использовать одинарные кавычки для атрибутов HTML (не верьте никому, кто пытается сказать вам, что они недействительны).

Так, например ::

$html = "<div id='blah'>$contents</div>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...