PHP をテンプレートにして作成
検索
開始行:
* 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);
?>
終了行:
* 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);
?>
ページ名:
[
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]