模板引擎与正则表达式

时间:2013-05-25 21:02:53

标签: php html regex arrays template-engine

我想写一个简单的模板引擎

我有一个html模板文件:

<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
    <loop "loop_name">
        content
        <loop "loop_name2">
            content2
        </loop "loop_name2">
    </loop "loop_name">
</body>
</html>

我需要找到具有正则表达式的所有循环和子循环,并用我预定义的php变量替换它们

我写了这个,但我知道这是错误的方式

preg_match_all("/\<loop \"(.*)\"\>(.*)\<\/loop \"(.*)\"\>/", $template_file_text, $matches);
print_r($matches);

任何答案都将不胜感激

2 个答案:

答案 0 :(得分:2)

REGEX无法以您可能需要的方式查找开始和匹配的结束标记。 Sidefact:如果有人想测试你的知识,你可能会问这个问题。

您可以使用XML解析器。看到: http://php.net/manual/de/book.xml.php

如果你想自己实现这个,你可以使用一个基于堆栈的算法,将任何开放元素放到堆栈中,如果你到达匹配的结束标记就弹出它。如果你想解析许多html页面,你最好采用PHP内置的XML解析器方式,因为你可能必须处理许多情况,其中页面没有被正确编写,错误处理将变得非常令人沮丧。

为了提高性能,您可以缓存输出文件。

答案 1 :(得分:1)

在我的头顶,你可以尝试这样的事情。 我只会将此方法用于非循环tbh,因为您仍然需要 循环数据,这就是事情变得复杂的地方。

$data = array(
    'loop'    => array(
        'subloop'  =>  array()
    ),
    'another'    => array()
);

public function parse($data, $template)
{
    $callback = function($matches) use ($data)
    {
        return isset( $data[$matches[1]] )
               ? $data[$matches[1]]
               : $matches[0]
    };

    return preg_replace_callback('/\@(.*?)\@/', $callback, $template)
}

您现在可以看到问题所在。

<body>
    @loop@
        @subloop@


    @another@
</body>