例如…
这个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');
});