【问题标题】:template engine with regular expression [closed]带有正则表达式的模板引擎
【发布时间】:2013-05-25 21:02:53
【问题描述】:

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

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

任何答案将不胜感激

【问题讨论】:

  • 您能否提供这些变量和预期输出的示例?

标签: php html regex arrays template-engine


【解决方案1】:

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

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

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

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

【讨论】:

  • 你们提供具有此功能的简单模板引擎吗?
  • @MohammadMasoudian 有各种各样的模板引擎。使用搜索引擎找到适合您的需求或搜索 Stackoverflow 有很多类似的问题。
  • @Chris 请看看 Twig 模板引擎是如何匹配的。它是 100% 基于正则表达式的
【解决方案2】:

在我的脑海中,你可以尝试这样的事情。 我只会将此方法用于非循环 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>

【讨论】:

  • 如何使用 HTML 解析器,因为这就是它们的用途。那就没有并发症了。
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2012-07-12
相关资源
最近更新 更多