-2

ファイル (index.bel) を含み、ファイル内の変数をレンダリングする単純なフレームワークを PHP で作成しようとしています。たとえば、index.bel には次の内容を含めることができます。

<h1>{$variable_name}</h1>

eval を使用したり、フレームワークのユーザーに次のように index.bel と入力するように要求したりせずに、どうすればこれを達成できますか。

$index = "<h1>{$variable_name}</h1>";

つまり、eval を使用せずにファイルの内容をレンダリングすることは可能ですか? 私の問題の有効な解決策は次のとおりです。

index.php:

<?php
$variable_name = 'Welcome!';
eval ('print "'.file_get_contents ("index.bel").'";');

index.bel:

<h1>{$variable_name}</h1>
4

2 に答える 2

4

多くの人がテンプレート エンジンを追加することを推奨していることは知っています、独自のエンジンを作成する場合は、str_replace を使用するのが最も簡単な方法です。

$index        = file_get_contents ("index.bel");
$replace_from = array ('$variable_a', '$variable_b');
$replace_to   = array ($var_a_value, $var_b_value);
$index        = str_replace($replace_from,$replace_to,$index);

これで単純な変数の置換が完了しましたが、すぐに、より多くのタグ、より多くの機能、およびこれらのようなことを行う 1 つの方法が必要になりますpreg_replace_callback{include:file.bel}最終的には変数を置き換えたり、他のファイルを含めたり、テキストを置き換えたりすることが可能になるので、それを見てみたいと思うかもしれません{img:foo.png}.

編集:あなたのコメントをもっと読んで、あなたは独自のフレームワークを作成しようとしています。preg_replace_callback物事を処理するためのより多くの方法を提供するので、見てください。

ここでの非常に簡単な例:

...
$index = preg_replace_callback ('/{([^}]+)}>/i', 'preg_callback', $index);
...

function preg_callback($matches) {
  var_dump($matches);

  $s = preg_split("/:/",$matches[1]);  // string matched split by :
  $f = 'func_'.strtolower($s[0]);      // all functions are like func_img,func_include, ...
  $ret = $f($s);                       // call function with all split parameters

  return $ret;
}

function func_img($s) {
  return '<img src="'.$s[1].'" />';
}

ここから、必要に応じて、たとえばすべての機能をクラスに分割するなど、これを (多くの方法で) 改善できます。

于 2012-06-01T09:47:04.747 に答える
0

はい、可能ですが、なぜ独自のフレームワークを作成しているのですか? あなたが提供したコードは、明らかに Smarty Template のように見えます。彼らがどのようにそれをしたかを見てみることができます。

これらのコードを実行する可能な方法は、コードを分割することです。ドル記号と、アンダースコア、文字、または数字ではない次の記号で分割します。あなたがそれをしたら。それを変数に解析できます。

$var = '変数名'; // 最初に分割します

echo $$var; // 指定された変数を取得します

このようなことを意味していましたか?

于 2012-06-01T09:39:12.290 に答える