2010-12-08 43 views
0

最近,我一直忙于一些PHP框架 - 顺便说一句,完全不在话题中。无论如何,我想用C++解析特定的html /模板文件(不要问我为什么,这只是因为我想用C++编写它)。除此之外,它实际上可能是我用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> 

为什么我这样做可能不这对你来说是完全清楚的,但它仍然是一个问题,在任何情况下都适用于其他地方。

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

+0

为什么不直接用纯PHP写网站? – Puppy 2010-12-08 20:34:56

+1

这不是我想要的;)。这是因为我想编写C++。你会发现,PHP变得迟钝,C++比较困难,编写这样的解析器比用普通的PHP编写更困难。 – Machiel 2010-12-08 20:42:19

+1

我总是很欣赏有人喜欢挑战;)。 – andand 2010-12-08 20:51:17

回答

0

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

1

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

2

根据您的实际要求,您可以编写一个手工解析器,这可能不是什么重要的东西。您的下一个最好的选择是使用类似BNF的C++解析器,例如boost :: spirit,所以你不需要自己处理分析规则。您仍需要编写正确的语义操作才能将{...}转换为php。