1

私は疑問に思っています-次のようなものを解析する最も効果的な方法は何ですか:

{{HEADER}}

Hello my name is {{NAME}}

{{#CONTENT}}
    This is the content ...

    {{#PERSONS}}

        <p>My name is {{NAME}}.</p>

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

もちろん、これは最終的にいくらかのテンプレート システムになることを意図しているので、私の計画は、このようなものとして、テンプレートを「配置」するハッシュマップを作成することです。

$hash = array(
    'HEADER' => 'This is a header',
    'NAME' => 'David',
    'CONTENT' => array('PERSONS' => array(array('NAME' => 'Heino'), array('NAME' => 'Sebastian')),
    'FOOTER' => 'This is the footer'
    );

「セクション」(# で始まるタグ) は複数回繰り返すことができることに注意してください。

また、任意のセクションには、任意の数の他のセクションと通常のタグを含めることができます...

それで..どうやってやったの?

4

6 に答える 6

1

最も効率的な方法は、テンプレートをphpコードにコンパイルすることです。そして、コンパイルされたバージョンを含めるだけです。

Smartyテンプレートエンジンは同様のことをします。また、smartyソースを調べて、タグがどのように解析されるかを確認することもできます。

于 2008-10-17T22:43:31.097 に答える
1

これの期待される出力は次のようなものですか?

これはヘッダーです

こんにちは私の名前はデビッドです

This is the content ...

My name is Heino.

My name is Sebastian.

これはフッターです


ハッシュマップ内のネストされた配列とテンプレート内の繰り返し可能なセクションとの関係をどのように管理していますか?テンプレートの実際の動作はどのようになっていますか?非セクション要素に配列が提供されている場合、それは何をしますか?セクション要素に単一の値が指定されている場合、それは単一の要素のみを持つ配列と同じように扱われますか(私はそう思います)?

とにかく、テンプレートのパーサーに関して(データのマッピングで何をするかに関係なく)...私が行うことは、トークン以外のコンテンツの一般的なものを含む、トークンのタイプごとにクラスを作成することです。これらは、オーバーライド可能なParse、Render、およびMapメソッドを持つ共通のトークン基本クラスから継承します。

状態図をグラフ化し、各状態の開始点と終了点を把握し、それをトークン間の呼び出し構造にエンコードします。最後に、テンプレートを説明するトークンの列挙可能なコレクションを生成する必要があります。

抽象形式になったら、トークンでMapを呼び出してコレクションを繰り返し、ハッシュマップからトークンにデータを割り当ててから、Renderを呼び出してテンプレートを最終的な形式にレンダリングします。

お役に立てば幸いです。

于 2008-10-17T18:42:27.560 に答える
0

私はより賢く、難しくはないので、サードパーティのパーサーを使用しますが、これを演習として行う場合、または本当に独自のテンプレートエンジンを構築したい場合(PHPではタグがあると思います)、私はまず、デザインパターン、具体的には複合デザインパターンを確認します。

複合パターンは、XML解析を含むこのようなもののためにJavaフレームワークで多く使用されます。

于 2008-10-17T18:42:04.970 に答える
0

XML や JSON などの既存のパーサーで何かを使用する方がよいでしょう。そうすれば、独自のパーサーを作成する必要がなくなり、他の人が専用のツールを必要とせずにパーサー用のドキュメントを簡単に作成できるようになります。ただし、独自のパーサーを作成する場合は、おそらくLexYaccの使用を検討する必要があります。

于 2008-10-17T18:22:47.567 に答える
0

.php の別のファイル内で次のようなものを使用します。

<?php echo $HEADER ?>

Hello my name is <?php echo $NAME?>

<div id="CONTENT">
    This is the content ...

    <?php foreach ($PERSONS as $PERSON) : ?>

        <p>My name is <?php echo $PERSON['NAME']?>.</p>

    <?php endforeach ?>

</div>

<?php echo $FOOTER ?>

そして、参照された変数が設定されているファイル内に上記のファイルを含めるだけです。

信じられないかもしれませんが、PHP はすでに、テンプレート システムが実装すると主張しているすべての機能を提供しています。PHP の上に別の抽象化レイヤー (および複雑さ) を追加する必要はありません。

于 2008-10-17T19:43:44.847 に答える
0

これにはPHP の DOMを使用します。私のテンプレート言語は、ID とクラスの属性を持つ単純な HTML です。ただし、計画に固執したい場合は、構文に一致するパターンと、ハッシュ内の適切な置換を見つけてコンテナー要素で再帰的に呼び出すコールバック関数でpreg_replace_callbackを使用します。

于 2008-10-17T20:08:11.333 に答える