0

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

我有一个 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);

任何答案将不胜感激

4

2 回答 2

2

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

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

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

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

于 2013-05-25T21:09:11.307 回答
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>
于 2013-05-25T21:18:45.620 回答