2010-12-08 7 views
0

最近、私はいくつかのPHPフレームワークに忙しかった。C++でテンプレートファイルを解析する

とにかく、私は特定のhtml/templateファイルを持っていますが、私はC++と解析したいと思います(なぜか、私にはC++で記述したいからです)。それ以外にも、実際にはC++で書く最初の便利なことかもしれません。私はこれがないかもしれませんやっているのはなぜ

<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> 

:出力があるべき

<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> 

そして:

とにかく、戻って問題に取得するために、私は次のようなファイルを持っている想像あなたにはっきりとはっきりしていますが、それは問題のままです。

とにかく、出力ファイルの前方および後方の検索と修正が必要です。この問題に対する正しいアプローチは何ですか?

+0

なぜ単純なPHPでサイトを書いてみませんか? – Puppy

+1

それは私が行ったことではなかった;)。私はC++を書いているからです。あなたは、PHPが鈍ってきていることを知っています.C++はかなり難しく、このようなパーサを書くことは、単なるPHPで書くよりも難しくなります。 – Machiel

+1

私はいつも良いチャレンジを楽しんでいる誰かを賞賛する;)。 – andand

答えて

0

これらのタイプの問題については、私はREGEXに傾く傾向があります。 boost::regexまたはGNU regexクラスまたは他のライブラリのいずれかを使用します。これらのマーカーを特定してそれらを変換するのは大部分が正規表現の検索であり、変数名や値などのパラメータを置き換えるものであり、完全なHTMLと特別な挿入を実際に解析するコードを書く必要はありません。

1

私の見解では、適切なアプローチは、ホイールを再発明しないでください(つまり、独自のパーサーを作成する)、むしろ既存のライブラリを使用することで、より簡単で時間を節約できます。これらのC++ライブラリの1つはwxHTMLParserまたはwxHTMLです。

+0

彼の入力ファイルは有効なhtmlではありません。 –

2

実際の要件に応じて、手作りのパーサーを書くことができますが、それは重要ではありません。あなたの次の最良の賭けは、BNFのようなC++パーサを使用することです。 boost :: spiritを使用するので、処理解析ルールを自分で処理する必要はありません。 {...}をPHPに変換するためには、正しいセマンティックアクションを書く必要があります。

+0

私はBoost Spiritライブラリを調べますが、それは有望です。私は手作りのパーサーに行くなら、まだ疑問に思っていました。キューやスタックを使って、これを解決するにはどうすればよいでしょうか? – Machiel