如何正确缩进PHP / HTML混合代码?

在混合使用PHP和HTML时,使用什么样的缩进风格? 我是否缩进,以便输出的HTML有正确的缩进,或者PHP / HTML混合看起来格式正确(因此更容易阅读)?

例如,说我有一个foreach循环输出表行。 哪一个是正确的?

PHP / HTML混合看起来是正确的:

 <table> <?php foreach ($rows as $row): ?> <tr> <?php if ($row->foo()): ?> <?php echo $row ?> <?php else: ?> Something else <?php endif ?> </tr> <?php endforeach ?> </table> 

输出的HTML看起来是正确的:

 <table> <?php foreach ($rows as $row): ?> <tr> <?php if ($row->foo()): ?> <?php echo $row ?> <?php else: ?> Something else <?php endif ?> </tr> <?php endforeach ?> </table> 

我发现,当我遇到这种情况(相当频繁),我没有一个标准的风格使用。 我知道可能没有一个“正确”的答案,但是我很想听听其他开发者的想法。

PHP和HTML都应该缩进,以便它们在源代码中相对于自己是正确的,而不pipe相互之间和输出forms如何:

 <table> <?php foreach ($rows as $row): ?> <tr> <?php if ($row->foo()): ?> <?php echo $row ?> <?php else: ?> Something else <?php endif ?> </tr> <?php endforeach ?> </table> 

我也经常思考这个问题,但后来我意识到,谁在乎HTML输出是什么样的? 你的用户不应该看你的HTML无论如何。 这是给阅读,也可能是其他开发者。 保持代码尽可能的干净,忘记输出是什么样的。

如果您需要debugging输出,请使用Chrome开发人员工具,Firebug甚至F12工具。

我通常把开放的 PHP标签放在行的开头,但缩进标签内的任何内容,以匹配的HTML格式。 但是,我不这样做,因为我使用short-open标签,所以对于简单的echo语句。 我觉得它通过浏览文件find所有的声明变得更简单。

  <table> <? foreach ($foo as $bar): ?> <tr> <? foreach ($bar as $baz): ?> <td><?=$baz?></td> <? endforeach ?> </tr> <? endforeach ?> </table> 
  1. 直接回答您的问题:如果您需要经常阅读HTML输出,那么输出格式良好的HTML可能是一件好事。 但更常见的情况是,你需要阅读你的PHP源代码,所以更重要的是,源是易于阅读。
  2. 另外你提到的两个选项:看到混乱'或tj111的答案。
  3. 更好的是在我看来:不要混合HTML和PHP,而是使用模板引擎。

你总是可以使用一些空白来提高可读性。 build立在混乱的压痕上:

 <table> <?php foreach ($rows as $row): ?> <tr> <?php if ($row->foo()): ?> <?php echo $row ?> <?php else: ?> Something else <?php endif ?> </tr> <?php endforeach ?> </table 

唯一的缺点是如果你有很多的混合代码,它可以让你的文件长两倍,这使得更多的滚动。 虽然如果你有这么多的混合代码,你可能要考虑一个模板引擎。

您不应该在生产环境中对标记压痕感到困扰。 您也不应该使用Tidy或其他HTML净化器。 有一些有效的用例,例如当你允许HTMLinput时(但是考虑使用Markdown ),虽然这很less见。

大多数HTML美化者 – filter被滥用以隐藏代码的底层问题。 别。 手动更正您的标记。

如果您只需在开发环境中缩进代码,则可以使用上述任一方法。 但是,请注意,这些库将尝试修正您的标记(这是他们的主要目的;缩进是一个副产品)。 我已经编写了基于正则expression式的缩进工具Dindent 。

Dindent会像这样转换标记:

 <!DOCTYPE html> <html> <head></head> <body> <script> console.log('te> <st'); function () { test; <!-- <a> --> } </script> <div> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <div><table border="1" style="background-color: red;"><tr><td>A cell test!</td> <td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr> <td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr> <td><input><input><input></td></tr><tr><td>Cell</td><td>Cell</td><td>Ce ll</td></tr></table></td></tr><tr><td>Test <span>Ce ll</span></td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div> </body> </html> 

对此:

 <!DOCTYPE html> <html> <head></head> <body> <script> console.log('te> <st'); function () { test; <!-- <a> --> } </script> <div> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <div> <table border="1" style="background-color: red;"> <tr> <td>A cell test!</td> <td colspan="2" rowspan="2"> <table border="1" style="background-color: green;"> <tr> <td>Cell</td> <td colspan="2" rowspan="2"></td> </tr> <tr> <td> <input> <input> <input> </td> </tr> <tr> <td>Cell</td> <td>Cell</td> <td>Ce ll</td> </tr> </table> </td> </tr> <tr> <td>Test <span>Ce ll</span></td> </tr> <tr> <td>Cell</td> <td>Cell</td> <td>Cell</td> </tr> </table> </div> </div> </body> </html> 

在添加缩进之后,Dindent不会试图消毒或干扰您的代码。 这是为了使您的开发/debugging更容易。 不用于生产。