代码之家  ›  专栏  ›  技术社区  ›  Dagg Nabbit

PHP-用自定义标记模板-这是eval的合法使用吗?

  •  5
  • Dagg Nabbit  · 技术社区  · 14 年前

    大约在2009年底,我为PHP/HTML编写了一个简单的模板系统,供我们的设计人员在内部用于小册子类网站。系统的目标是允许通过PHP处理的自定义标记在纯HTML中进行模板化。例如,模板页面可能如下所示:

    <tt:Page template="templates/main.html">
      <tt:Content name="leftColumn">
        <p> blah blah </p>
        ...
      </tt:Content>
      <tt:Content name="rightColumn">
        <p> blah blah </p>
        ...
      </tt:Content>
    </tt:Page>
    

    <html>
      <head>...</head>
      <body>
        <div style="float:left; width:45%">
          <tt:Container name="leftColumn" />
        </div>
        <div style="width:45%">
          <tt:Container name="rightColumn" />
        </div>
      </body>
    </html>
    

    除了页面和内容/容器标记外,核心中还包含了一些其他标记,用于流控制、对集合进行迭代、输出动态值等。该框架的设计使您可以很容易地添加在另一个前缀和命名空间下注册的自己的标记集。

    PHP自定义标记

    因此,在框架用PHP替换模板标记之后,我们的示例页面可能看起来像这样(在现实中,它有点难看):

    <?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
      <?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
        <p> blah blah </p>
        ...
      <?php $tags->pop(); ?>
      <?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
        <p> blah blah </p>
        ...
      <?php $tags->pop(); ?>
    <?php $tags->pop(); ?>
    

    eval

    评估 评估

    php:// 输出流等,但据我所知,这些并没有提供任何真正的优势 评估 . 缓存可以加快速度,但实际上我们在这方面的所有站点都已经非常快了,所以我认为在这一点上没有必要进行速度优化。

    问题

    对于清单上的每一件事:这是个好主意吗?你能想出更好的选择吗?

    • 总体思路(html/php的自定义标记)
    • 将标记转换为php代码而不是直接处理
    • 使用 评估 (或类似)

    感谢您的阅读和TIA的任何建议。:)

    3 回复  |  直到 14 年前
        1
  •  2
  •   John Kugelman Michael Hodel    14 年前

    让我提倡一种不同的方法。不要动态生成PHP代码,然后试图找出如何安全地执行它,而是在遇到标记时直接执行它。你可以 马上。

    1. 寻找一个自定义标签,你可以在 .
    2. 位置之前的一切 必须是简单的HTML,所以要么保存它以供处理,要么立即输出它(如果您的页面上没有标记) $tags
    3. 为标记执行适当的代码。而不是生成调用 $tags->push ,打电话就行了
    4. 返回步骤1。

    eval 他走了。

    push . 然后,当你点击结束标记时,你可以做一个 pop 然后以适当的方式处理标记,现在您已经处理了自定义元素的全部内容。

    n )在绳子的长度上。这意味着你反复扫描字符串一遍又一遍,每次你做一个替换你必须产生一个类似长度的全新字符串。如果您有20KB的HTML,那么每次替换都需要搜索20KB,然后创建一个新的20KB字符串。

        2
  •  2
  •   Mike Sherov    14 年前

    本质上,这个问题是询问如何用regex执行PHP代码。这似乎不那么明显,但这就是评估的目的。

    也就是说,您不必先执行preg\u replace,然后再执行eval,只要使用PHP的preg\u replace\u回调函数在匹配时执行一段代码即可。

    http://us.php.net/manual/en/function.preg-replace-callback.php

        3
  •  0
  •   Mike Sherov    14 年前

    ob_start();
    include($template_file); //has some HTML and output generating PHP
    $result = ob_get_contents();
    ob_end_clean();