相关疑难解决方法(0)

简单的PHP模板......这可以在没有`eval`的情况下工作吗?

更新 -感谢所有回复.这个问题变得有些混乱,所以如果有人感兴趣,我就开始续集了.


我正在为朋友拼凑一个快速脚本,并偶然发现了一种在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}">&nbsp;</td>
      <td colspan="1" class="send"><input type="submit" value="{$lang['T_SEND']}" /></td>
    </tr>
  </table>

</form>
Run Code Online (Sandbox Code Playgroud)

为什么要使用模板? …

php templates eval heredoc

16
推荐指数
3
解决办法
6069
查看次数

标签 统计

eval ×1

heredoc ×1

php ×1

templates ×1