1

我正在尝试制作自己的模板引擎,(不要问为什么!)

并将尝试制作:

{{@Form::input("name")}}

在我的渲染系统中,我将制作这个 eval 代码:

    preg_match_all('/\{\{\@(.*?)\}\}/is',$data,$output);

    $out="";

    foreach ( $output[1] as $variables):
        $find = '{{@' . $variables . '}}';

        $data = str_replace($find, eval($variables), $data);
    endforeach;

但我收到了这个错误

 Parse error: syntax error, unexpected $end in /home/psafari/public_html/slt/classes/template.class.php(43) : eval()'d code on line 1

它应该按照模板引擎中的规定运行“Form::input('something')”。我究竟做错了什么?

4

1 回答 1

0

尽管已经有uber相关的评论反对建立一个新的模板引擎,我还是建议打破找到的字符串。以您的示例为例{{@Form::input("name")}},您将拥有 {{@ CLASS_NAME :: FUNCTION_NAME ( params )}}。因此,使用正则表达式,您可以破坏找到的字符串(就像您已经做的那样),创建一个实例或引用检测到的类,然后调用使用动态调用解析的方法(如果未找到任何一个,显然会失败/错误)。

至于参数,您可以避免使用限定符(在这种情况下为引号)并在每个逗号上中断,或者使用限定符并再次通过正则表达式对其进行不同的解析。你的来电。对于解析和找到的每个参数,它们将被添加到函数调用中。为了避免eval,并且鉴于 PHP 不支持随机数量的参数(例如 Python 使用argsand kwargs),将数组作为您将在模板文件上使用的函数的单个参数。

您还可以有一种“接口”函数,它接受一定数量的参数,然后接收函数(或类+函数名称),计算它找到的参数数量,最后将调用中继到基于实际的底层函数找到正确数量的参数。尽管您添加的越多,处理变得越模糊 - 假设您的模板引擎的用户将能够定义新的模板方法,使用第二条路线是一个非常糟糕的主意(因为您必须支持最多N个参数这些接口函数)。

于 2013-08-11T00:28:29.023 回答