2010-12-08 52 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。