我可以将PHP配置为自动格式化它生成的HTML吗


Can I configure PHP to automatically format the HTML it generates?

例如…

这个PHP代码

<?php
echo '<html>';
echo '<body>';
echo '<h1>Header One</h1>';
echo '<p>Hello World!</p>';
echo '</body>';
echo '</html>';
?>

生成此HTML标记

<html><body><h1>Header One</h1><p>Hello World!</p></body></html>

是否有任何函数、库或配置选项可以使PHP根据输出中生成的html标记的嵌套自动应用一些简单的格式设置(换行符和缩进)?这样就会产生这样的东西…

<html>
      <body>
            <h1>Header One</h1>
            <p>Hello World!</p>
      </body>
</html>

您可以尝试Smarty、Savant、PHP Sugar或VLib等模板引擎。

或者你可以去突击队输出处理(我认为这是一个黑客)。ob_start('ob_tidyhandler');

对于输出处理,Tidy可能没有安装或启用,通常需要安装的包名为php-tidy,并且需要在php.ini中取消注释extension=tidy

您可以将html放入PHP脚本中,而无需对其进行回显。您可能还想寻找像smarty这样的PHP模板引擎,以便将视图与逻辑分离。

我更喜欢使用heredoc字符串并自己格式化/缩进HTML。在PHP代码中混合HTML字符串会很快导致无法读取、无法维护的代码。这种方法的一些优点:

  • 报价不需要转义
  • 您可以将变量放入heredoc字符串中
  • 即使在处理循环代码时,也可以在heredoc字符串中输出HTML。如果这些字符串相对于其他HTML块正确缩进,您仍然可以得到具有良好缩进的HTML代码
  • 它迫使您考虑何时打印HTML,并将其分块打印,而不是在代码中散布大量小块(很难阅读和维护)

最好尽可能地将PHP代码与HTML分离,无论这意味着使用模板引擎还是将所有代码放在所有HTML之前。然而,有时混合PHP和HTML仍然是最容易的。

这里有一个例子:

<?php
$text = 'Hello World!';
echo <<<HTML
<html>
    <body>
        <h1>Header One, with some '"quotes"'</h1>
        <p>$text</p>
    </body>
</html>
HTML;
?>

如果我理解你的问题,你想漂亮地打印HTML输出。

这可以通过对PHP脚本的输出进行后处理来完成。要么使用PHP的输出处理功能,再结合整洁的扩展­文档:

ob_start('ob_tidyhandler');

Tidy是一个专门用于清理HTML代码、更改缩进等的扩展。但这并不是唯一的方法。

另一种选择是将后处理任务委托给Web服务器,例如Apache HTTP Server中的输出过滤器­文档

你可以这样做(我的偏好):

<html>
      <body>
            <h1>Header One</h1>
            <p>Hello World!</p>
            <?php echo '<p>Hello Hello!</p>'; ?>
      </body>
</html>

或者:

<?php
$html = '<html><body><h1>Header One</h1><p>Hello World!</p></body></html>';
$tidy = new tidy();
$tidy->parseString($html, array('indent'=> true,'output-xhtml'=> true), 'utf8');
$tidy->cleanRepair();
echo $tidy;
?>";

将打印:

<html>
      <body>
            <h1>Header One</h1>
            <p>Hello World!</p>
      </body>
</html>

。。。或者,您可以使用"<<<"运算符,在该运算符中您可以自己设置编队:

<?php
echo <<<DATA
<html>
      <body>
            <h1>Header One</h1>
            <p>Hello World!</p>
      </body>
</html>
DATA;

如果下面的代码看起来对用php生成html很有用,请尝试这个库https://github.com/raftalks/Form

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');
});