更新 -感谢所有回复.这个问题变得有些混乱,所以如果有人感兴趣,我就开始续集了.
我正在为朋友拼凑一个快速脚本,并偶然发现了一种在PHP中进行模板化的简单方法.
基本上,我们的想法是将html文档解析为heredoc字符串,因此PHP中的变量将被扩展.
passthrough函数允许在字符串中进行表达式求值和函数以及静态方法调用:
function passthrough($s){return $s;}
$_="passthrough";
Run Code Online (Sandbox Code Playgroud)
在heredoc字符串中解析文档的代码非常简单:
$t=file_get_contents('my_template.html');
eval("\$r=<<<_END_OF_FILE_\n$t\_END_OF_FILE_;\n");
echo $r;
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,它使用eval.
任何人都可以想到一种方法来做这种模板而不使用eval,但没有添加解析器或大量的正则表达式疯狂?
没有编写完整的解析器,任何逃避不属于PHP变量的流浪美元符号的建议?流浪的美元符号问题是否会使这种方法不适合"严重"使用?
这是一些模板化的HTML代码示例.
<script>var _lang = {$_(json_encode($lang))};</script>
<script src='/blah.js'></script>
<link href='/blah.css' type='text/css' rel='stylesheet'>
<form class="inquiry" method="post" action="process.php" onsubmit="return validate(this)">
<div class="filter">
<h2>
{$lang['T_FILTER_TITLE']}
</h2>
<a href='#{$lang['T_FILTER_ALL']}' onclick='applyFilter();'>
{$lang['T_FILTER_ALL']}
</a>
{$filter_html}
</div>
<table class="inventory" id="inventory_table">
{$table_rows}
<tr class="static"><th colspan="{$_($cols+1)}">
{$lang['T_FORM_HELP']}
</th></tr>
{$form_fields}
<tr class="static">
<td id="validation" class="send" colspan="{$cols}"> </td>
<td colspan="1" class="send"><input type="submit" value="{$lang['T_SEND']}" /></td>
</tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)