あちあち情報局

趣味や日曜プログラムなどを書いています

ユーザ用ツール

サイト用ツール


php_template

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
最新リビジョン 両方とも次のリビジョン
php_template [2019/01/02 08:16]
管理者
php_template [2019/01/03 01:34]
管理者 [カスタマイズ]
ライン 1: ライン 1:
 ====== PHP 簡易的なテンプレートエンジン ====== ====== PHP 簡易的なテンプレートエンジン ======
-外部テンプレートファイルを読み込み、テンプレート中の専用タグと同前を持った配列キーの内容を出力するだけの簡易的なテンプレートエンジンです。+外部テンプレートファイルを読み込み、テンプレート中の専用タグと同名の連想配列の内容を出力するだけの簡易的なテンプレートエンジンです。
  
-テンプレートはテキストとて読み込配列データをstr_replaceで文字置換しているので処理速度は低速PHPの構文も使えませんしかしテンプレート中でPHPが使えないでPHPの構文エラーによるトラブルもりません+includeを使ってないのでPHP構文を使った複雑な処理はできませんが、逆にテンプレート編集でPHP構文エラーが発生ませ。 
 + 
 +大きな欠点は、表示する配列データの数だけ繰り替えし文字置換しているので配列(要素)が多くなると処理時間が大きくなる事特にテンプレートのファイサイズ大きい場合には影響が大きくなりま
  
 ---- ----
-====== コード ======+===== 自作関数 ​===== 
 + 
 +入力された連想配列からキーとデータを分離し、データ部から専用タグの文字 %%{%%と%%}%% をエスケープして、テンプレートのキーと同名の専用タグを置換しています。
  
 <code php> <code php>
 +// ---------- 簡易テンプレートエンジン関数 ---------- ​
 function template_engin($html,​$dataArray){ function template_engin($html,​$dataArray){
 +  // 入力データを順番に置換({と}は再帰的に処理しないようエスケープ)
   foreach ($dataArray as $key => $value){   foreach ($dataArray as $key => $value){
 +    $value = str_replace( '​{',​ '&#​123;',​ $value);
 +    $value = str_replace( '​}',​ '&#​125;',​ $value);
     $html = str_replace( '​{{'​.$key.'​}}',​ $value, $html);     $html = str_replace( '​{{'​.$key.'​}}',​ $value, $html);
   }   }
-  ​//不要なタグ除去+ 
 +  ​// テンプレート上に残った専用タグ除去
   $html=preg_replace('/​{{.*}}/','',​$html);​   $html=preg_replace('/​{{.*}}/','',​$html);​
-  ​//​変換されたデータを返す+ 
 +  ​// 変換されたデータを返す
   return $html;   return $html;
 } }
 </​code>​ </​code>​
  
-注意:ソースコードを見ればわかりますが、与えた配列$dataArrayを繰り替えし文字置換しているので$dataArrayの要素数が多ければ多いほど、$htmlのサイズが大きければ大きいほど低速化します。+==== プログラム例 ====
  
 +下記2つのファイルをPHPの動作するディレクトリに保存して、ブラウザでtemplate.phpを表示するとテンプレートの専用タグの一に出力データが表示されます。
  
 +<code php template.php>​
 +<?php
 +  // ---------- 簡易テンプレートエンジン関数 ---------- ​
 +  function template_engin($html,​$dataArray){
 +    foreach ($dataArray as $key => $value){
 +      $value = str_replace( '​{',​ '&#​123;',​ $value);
 +      $value = str_replace( '​}',​ '&#​125;',​ $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許可選択」・専用タグの「多重展開の防止」・「使用しなかった専用タグの除去」を行っています。 
  
-イメージ 
-^テンプレート^+^データ(php)^ 
-|<code html><​h1>​{{title}}</​h1>​ 
-<​p>​{{text}}</​p></​code>​|+|<​code php>​$output{'​title'​}='​デモ';​ 
-$output{'​text'​}='​Hello world!'</​code>​| 
  
-^ ↓結果 ​ ^ +===== カスタマイズ ===== 
-|<code html><​h1>​モ</​h1>​ +単純にータを展開するだけだと芸が無いので「HTML許可選択」を追加行っています。専用タグのキー名の頭に@をつけるとHTML許可して、@が無ければHTMLを不許可にしています。
-<​p>​Hello world!</​p></​code>​|+
  
------ 
 ===== デモプログラムコード ===== ===== デモプログラムコード =====
 下記のtemplate.phpとtemplate.htmlは同じフォルダに保存してください。(template.htmlはファイルパスを書き換えれば任意のディレクトリに移動できます) 下記のtemplate.phpとtemplate.htmlは同じフォルダに保存してください。(template.htmlはファイルパスを書き換えれば任意のディレクトリに移動できます)
php_template.txt · 最終更新: 2019/01/03 01:36 by 管理者