* PHP覚え書き
- [[PHP/めも]]

** テンプレートパーサー
- テンプレートHTMLを解析し、キーワードを値で置換するプログラム案。たとえば掲示板の発言一覧をループするところ。重そう。
 // 1つの文字列としてファイルを読み込む。エラー処理してね。
 $basefile = &file_get_contents('Template.html');
 
 // 特定パターン発見ごとに関数をコールバックする書き方。
 // 複数回のマッチングに絶えられる。ただし重そうだが。
 $basefile = &preg_replace("/(.*)(<\!--##BODY_LOOP_START##-->)(.*)(<\!--##BODY_LOOP_END##-->)(.*)/se",
        '"\1".callback($ds, "\3")."\5"', $basefile);
 
 function callback(&$ds, $baseStr) {
   foreach ($ds as $d) {
     $tmpStr = $baseStr;
     $tmpStr = &preg_replace("/(##NAME##)/s", $d['name'], $tmpStr);
     $tmpStr = &preg_replace("/(##COMM##)/s", $d['comm'], $tmpStr);
     $rtnStr .= $tmpStr;
   }
   return $rtnStr;
 }
- コールバックが複数回呼ばれるなら内部でバッファリングしちゃう?
 function callback(&$ds, $baseStr) {
   if (isset($GLOBAL['_callback_rtnstr']))
     return $GLOBAL['_callback_rtnstr'];
   foreach ($ds as $d) {
     $tmpStr = $baseStr;
     $tmpStr = &preg_replace("/(##NAME##)/s", $d['name'], $tmpStr);
     $tmpStr = &preg_replace("/(##COMM##)/s", $d['comm'], $tmpStr);
     $rtnStr .= $tmpStr;
   }
   // どうだろうねぇ
   $GLOBAL['_callback_rtnstr'] = &$rtnStr;
   return $rtnStr;
 }
- ちなみにコールバックをこのように呼ぶと勝手に addslashes がかかった状態になる。
 $basefile = &preg_replace("/(.*)(<\!--##BODY_LOOP_START##-->)(.*)(<\!--##BODY_LOOP_END##-->)(.*)/se",
        "'\\1'.callback(\$ds, '\\3').'\\5'", $basefile);

** なにこのコメント??
- 以下はコメントだけのコード。ところがコイツをPHPにかけると不思議な出力をしやがる。場合によってはParse errorが出る。環境はPHP-4.3.2
 <?php
 //  $basefile = &preg_replace('/(.*)(<div[\s.]*class="?hoge"?.*?>)(.*)(<\/div>)(.*)/se',
 //      '"\1\2".callback($ds, "\3")."\4\5"', $basefile);
 ?>

[ 編集 | 差分 | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]