我想写一个简单的模板引擎
我有一个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);
任何答案都将不胜感激
答案 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>