この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
php_template [2019/01/02 07:56] 管理者 |
php_template [2019/01/03 00:58] 管理者 |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
====== PHP 簡易的なテンプレートエンジン ====== | ====== PHP 簡易的なテンプレートエンジン ====== | ||
- | 外部テンプレートファイルを読み込み、テンプレート中の専用タグと同じ名前を持った配列キーの内容を出力するだけの簡易的なテンプレートエンジンです。 | + | 外部テンプレートファイルを読み込み、テンプレート中の専用タグと同名の連想配列の内容を出力するだけの簡易的なテンプレートエンジンです。 |
- | テンプレートはテキストとして読み込んでstr_replaceで文字置換しているので処理速度は低速でPHPの構文も使えません。しかしテンプレート中でPHPが使えないのでPHPの構文エラーによるトラブルもありません。 | + | includeを使ってないのでPHP構文を使った複雑な処理はできませんが、逆にテンプレート編集ではPHP構文エラーが発生しません。 |
+ | |||
+ | 大きな欠点は、表示する配列データの数だけ繰り替えし文字置換しているので配列(要素)が多くなると処理時間が大きくなる事です。特にテンプレートのファイルサイズも大きい場合には影響が大きくなります。 | ||
---- | ---- | ||
- | ※※※※※※※※※※\\ | + | ===== 自作関数 ===== |
- | 機能を絞り、たった3行の「[[php_template2|テンプレートエンジンその2]]」を新しく作ったのでそちらも参照して下さい。\\ | + | |
- | ※※※※※※※※※※ | + | |
+ | 入力された連想配列からキーとデータを分離し、データ部から専用タグの文字 %%{%%と%%}%% をエスケープして、テンプレートのキーと同名の専用タグを置換しています。 | ||
+ | |||
+ | <code php> | ||
+ | // ---------- 簡易テンプレートエンジン関数 ---------- | ||
+ | function template_engin($html,$dataArray){ | ||
+ | // 入力データを順番に置換({と}は再帰的に処理しないようエスケープ) | ||
+ | foreach ($dataArray as $key => $value){ | ||
+ | $value = str_replace( '{', '{', $value); | ||
+ | $value = str_replace( '}', '}', $value); | ||
+ | $html = str_replace( '{{'.$key.'}}', $value, $html); | ||
+ | } | ||
+ | |||
+ | // テンプレート上に残った専用タグを除去 | ||
+ | $html=preg_replace('/{{.*}}/','',$html); | ||
+ | |||
+ | // 変換されたデータを返す | ||
+ | return $html; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== プログラム例 ==== | ||
+ | |||
+ | 下記2つのファイルをPHPの動作するディレクトリに保存して、ブラウザでtemplate.phpを表示するとテンプレートの専用タグの一に出力データが表示されます。 | ||
+ | |||
+ | <code php template.php> | ||
+ | <?php | ||
+ | // ---------- 簡易テンプレートエンジン関数 ---------- | ||
+ | function template_engin($html,$dataArray){ | ||
+ | foreach ($dataArray as $key => $value){ | ||
+ | $value = str_replace( '{', '{', $value); | ||
+ | $value = str_replace( '}', '}', $value); | ||
+ | $html = str_replace( '{{'.$key.'}}', $value, $html); | ||
+ | } | ||
+ | $html=preg_replace('/{{.*}}/','',$html); | ||
+ | return $html; | ||
+ | } | ||
+ | |||
+ | // ---------- メイン ---------- | ||
+ | |||
+ | // テンプレートファイルの読み込み | ||
+ | $fileTemp = file_get_contents('template.html'); | ||
+ | |||
+ | // テンプレート出力用の連想配列初期化 | ||
+ | $dataArray=array(); | ||
+ | |||
+ | // 出力データを登録(外部ユーザーの入力値はhtmlspecialcharsする事) | ||
+ | $dataArray['title']='デモタイトル'; | ||
+ | $dataArray['data'] =date("Y/m/d H:i:s"); | ||
+ | $dataArray['text'] =htmlspecialchars('Hello World!',ENT_QUOTES,'UTF-8'); | ||
+ | $dataArray['html']='<a href="http://www.google.co.jp/">Google</a>'; | ||
+ | |||
+ | //テンプレート関数実行 | ||
+ | $output=template_engin($fileTemp,$dataArray); | ||
+ | |||
+ | //表示 | ||
+ | echo $output; | ||
+ | </code> | ||
+ | |||
+ | <code html template.html> | ||
+ | <!DOCTYPE html> | ||
+ | <html lang="ja"> | ||
+ | <head> | ||
+ | <meta charset="utf-8"> | ||
+ | <title>{{title}}</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <h1>{{title}}</h1> | ||
+ | <p>日付:{{data}}</p> | ||
+ | <p>通常文書:{{text}}</p> | ||
+ | <p>HTML許可:{{html}}</p> | ||
+ | <p>未使用キーは除去→:{{hogehoge}}</p> | ||
+ | </body> | ||
+ | </html> | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== カスタマイズ ===== | ||
単純にデータを展開するだけだと芸が無いので、最低限の挿入データごと「HTML許可選択」・専用タグの「多重展開の防止」・「使用しなかった専用タグの除去」を行っています。 | 単純にデータを展開するだけだと芸が無いので、最低限の挿入データごと「HTML許可選択」・専用タグの「多重展開の防止」・「使用しなかった専用タグの除去」を行っています。 | ||
ライン 20: | ライン 101: | ||
|<code html><h1>デモ</h1> | |<code html><h1>デモ</h1> | ||
<p>Hello world!</p></code>| | <p>Hello world!</p></code>| | ||
+ | |||
+ | |||
----- | ----- |