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);
    ?>

[ 編集 | 凍結 | 差分 | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]
Last-modified: 2004-09-08 (水) 03:02:49 (6129d)