0

我有一个模板 .php 文件,其中包含一堆函数来呈现 html。这是一个片段:

$j ='    
table("tb_02", "600", "", "ebebeb", "right", "top", "30 0 30 0","Table content...");
//whole bunch of similar functions here...
';

表函数如下所示:

    function table($tbID, $tbWidth, $tbHeight, $tbBgColor, $tbHzAlign, $tbVtAlign, $tbPad, $tbContent) {
// code omitted here     
$a = "
          <table id=\"$tbID\" width=\"$tbWidth\" $tbHeight $tbBgColor border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
            <tr>
              <td valign=\"$tbVtAlign\" align=\"$tbHzAlign\" width=\"$tbWidth\" style=\"$pad\">
        $tbContent
              </td>
            </tr>
          </table>  
        "; 
          echo $a;
        };

我想要做的是将模板 .php 文件(仅是 html - 没有 php)中 $j 的结果转换为字符串。我遇到的问题是我首先需要它 eval'd (函数的结果,然后转换它)。我正在追求这样的东西,但找不到将 eval'd 代码恢复为字符串的方法:

$j = eval($j);
$j = str_replace("<", "&lt;", $j);
$j = str_replace(">", "&gt;", $j);
echo $j;

谢谢您的帮助!

4

1 回答 1

1

eval不是模板系统。它很慢,不安全,不应该使用。总有更好的方法来做事。

我建议四处寻找一个真正的模板系统,你正在做的是非常糟糕的做法。

首先,你的函数应该是return数据,而不是数据echo。这样一来,您就可以操纵它,并且echo一次将其全部清除。

其次,看看HEREDOCs,它们会让你的生活更轻松。

function table($tbID, $tbWidth, $tbHeight, $tbBgColor, $tbHzAlign, $tbVtAlign, $tbPad, $tbContent) {
    // code omitted here     
    $a = <<<HTML
    <table id="$tbID" width="$tbWidth" $tbHeight $tbBgColor border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td valign="$tbVtAlign" align="$tbHzAlign" width="$tbWidth" style="$pad">$tbContent</td>
        </tr>
    </table>
HTML;

    return $a;
}

最后,你不应该尝试eval拉弦,这是打击垫练习。我的建议可能不是更好的做法,但它比eval.

不要$j成为字符串,而是尝试将其设为数组。

$j = array(
    'table' => array("tb_02", "600", "", "ebebeb", "right", "top", "30 0 30 0","Table content...")
);

现在您可以做的是使用call_user_func_array“评估”代码。

$html = '';

foreach($j as $func=>$args){
    $x = call_user_func_array($func, $args);

    $x = str_replace("<", "&lt;", $x);
    $x = str_replace(">", "&gt;", $x);

    $html .= $x;
}

echo $html;
于 2012-12-04T22:04:32.613 回答