使用C ++解析模板文件

时间:2010-12-08 20:28:02

标签: c++ parsing

最近我一直忙于一些PHP框架 - 顺便说一下,完全偏离主题。

无论如何,我得到了我想用C ++解析的特定html /模板文件(不要问我为什么,这只是因为我想用C ++编写)。除此之外,它实际上可能是我用C ++编写的第一个有用的东西。

无论如何,要想回到这个问题,想象一下我有一个如下文件:

<table>
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Actions</th>
    </tr>
    {foreach from="$pages => $page"}
    <tr>
        <td>{$page.Id()}</td>
        <td>{$page.Title()}</td>
        <td><a href="page/edit/{$page.Id()}/">Edit</a> | <a href="page/delete/{$page.Id()}/">Delete</a></td>
    </tr>
    {foreachelse}
    <tr>
        <td colspan="3">There are no pages to be displayed</td>
    </tr>
    {/foreach}
</table>

输出应为:

<table>
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Actions</th>
    </tr>
    <?php if(count($pages) > 0): ?>
    <?php foreach($pages as $page): ?>
    <tr>
        <td><?php echo $page->getId(); ?></td>
        <td><?php echo $page->getTitle(); ?></td>
        <td><a href="page/edit/<?php echo $page->getId(); ?>/">Edit</a> | <a href="page/delete/<?php echo $page->getId(); ?>/">Delete</a></td>
    </tr>
    <?php endforeach; ?>
    <?php else: ?>
    <tr>
        <td colspan="3">There are no pages to be displayed</td>
    </tr>
    <?php endif; ?>
</table>

为什么我这样做可能不太清楚,但它仍然是一个问题,无论如何都适用于其他地方。

无论如何,需要在输出文件中进行一些前向和后向查找和修改。解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以编写手工解析器,这可能非常重要,具体取决于您的实际要求。您的下一个最佳选择是使用类似BNF的C ++解析器,例如: boost :: spirit,所以你不需要自己处理解析规则。您仍然需要编写正确的语义操作来将{...}转换为php。

答案 1 :(得分:1)

在我看来,正确的方法不会重新发明轮子(即编写自己的解析器),而是现有的库,这将使您更容易,更省时。其中一个C ++库可能是wxHTMLParserwxHTML

答案 2 :(得分:0)

对于这些类型的问题,我倾向于倾向于REGEX。使用boost::regex或GNU正则表达式类或任何其他库。识别这些标记并转换它们主要是正则表达式搜索和替换(使用变量名称,值等参数),并且您不必编写代码来实际解析完整的HTML和特殊插入。