最近我一直忙于一些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>
为什么我这样做可能不太清楚,但它仍然是一个问题,无论如何都适用于其他地方。
无论如何,需要在输出文件中进行一些前向和后向查找和修改。解决这个问题的正确方法是什么?
答案 0 :(得分:2)
您可以编写手工解析器,这可能非常重要,具体取决于您的实际要求。您的下一个最佳选择是使用类似BNF的C ++解析器,例如: boost :: spirit,所以你不需要自己处理解析规则。您仍然需要编写正确的语义操作来将{...}转换为php。
答案 1 :(得分:1)
在我看来,正确的方法不会重新发明轮子(即编写自己的解析器),而是现有的库,这将使您更容易,更省时。其中一个C ++库可能是wxHTMLParser或wxHTML。
答案 2 :(得分:0)
对于这些类型的问题,我倾向于倾向于REGEX。使用boost::regex
或GNU正则表达式类或任何其他库。识别这些标记并转换它们主要是正则表达式搜索和替换(使用变量名称,值等参数),并且您不必编写代码来实际解析完整的HTML和特殊插入。