Top  Dolphy Software  

TOP > セミナー >  HTMLテンプレート > フォーマット

データを加工して置換

連想配列にあるデータを加工してから置換してみましょう。
show.php   show.htm
<?php
// テンプレートの読み込み
$html = file_get_contents("show.htm");
// テンプレートの文字コード変換
$to_encoding = mb_internal_encoding(); $html = mb_convert_encoding($html, $to_encoding, "auto"); // データ
$data = array( "name" => "りんご", "price" => 1230, "remark" => "ふじ\n青森県産" ); // テンプレート文字の置換 // < > などの特殊文字を &lt; &gt; に変換し置換します $html = str_replace("{data.name}", htmlspecialchars($data['name']), $html); // 数字を3桁ごとのカンマで区切に変換し置換します $html = str_replace("{data.price}", number_format($data['price']), $html); // 特殊文字の変換後に改行を <br /> に変換して置換します $html = str_replace("{data.remark}", nl2br(htmlspecialchars($data['remark'])), $html); // テンプレートの出力 print $html; ?>
  <html>
<head>
<title>詳細表示</title>
</head>
<body>
<table border="1">
<tr>
<td>品名</td>
<td>{data.name}</td>
</tr>
<tr>
<td>価格</td>
<td>{data.price}</td>
</tr>
<tr>
<td>備考</td>
<td>{data.remark}</td>
</tr>
</table>
</body>
</html>

次にデータを一括して置換する例を2つは...
ループで置換する   show.htm
// テンプレート文字の置換
foreach ($data as $key => $val) {
  // < > などの特殊文字を &lt; &gt; に変換し置換します
  $html = str_replace("{data.$key}", htmlspecialchars($val), $html);
  // 数字を3桁ごとのカンマで区切に変換し置換します
  if (is_numeric($val))
    $html = str_replace("{data.$key.number}", number_format($val), $html);
  else
    $html = str_replace("{data.$key.number}", htmlspecialchars($val), $html);
  // 特殊文字の変換後に改行を <br /> に変換して置換します
  $html = str_replace("{data.$key.br}", nl2br(htmlspecialchars($val)), $html);
}
  <html>
<head>
<title>詳細表示</title>
</head>
<body>
<table border="1">
<tr>
<td>品名</td>
<td>{data.name}</td>
</tr>
<tr>
<td>価格</td>
<td>{data.price.number}</td>
</tr>
<tr>
<td>備考</td>
<td>{data.remark.br}</td>
</tr>
</table>
</body>
</html>
     
正規表現のe修飾子を使って置換する   $html
// テンプレート文字の置換
 
// < > などの特殊文字を &lt; &gt; に変換し置換します $str = preg_quote("{data.*}"); $pattern = '/'.str_replace('\*', '([a-zA-Z0-9_\-]+)', $str).'/e'; $replacement = 'htmlspecialchars($data["$1"])'; $html = preg_replace($pattern, $replacement, $html); // 拡張子.numberは3桁ごとのカンマで区切に変換し置換します // 拡張子.brは改行を <br /> に変換して置換します $str = preg_quote("{data.*.*}"); $pattern = '/'.str_replace('\*', '([a-zA-Z0-9_\-]+)', $str).'/e'; $replacement = '$2($data["$1"])'; $html = preg_replace($pattern, $replacement, $html); // 数字を3桁ごとのカンマで区切に変換、文字は特殊文字の変換 function number($str) { return is_numeric($str) ? number_format($str) : htmlspecialchars($str); } // 特殊文字の変換後に改行を <br /> に変換 function br($str) { return nl2br(htmlspecialchars($str)); }
  <html>
<head>
<title>詳細表示</title>
</head>
<body>
<table border="1">
<tr>
<td>品名</td>
<td>りんご</td>
</tr>
<tr>
<td>価格</td>
<td>1,230</td>
</tr>
<tr>
<td>備考</td>
<td>ふじ<br />
青森県産</td>
</tr>
</table>
</body>
</html>

補足

正規表現のe修飾子を使って置換するときの注意 2007-12-13

preg_replace( )でe修飾子を使って置換するとき、文字列にシングルクォート(')、ダブルクォート(")、バックスラッシュ(\)があるとクォートされるので、元に戻すために stripslashes( ) を使うと良いと思います。

修正例

// < > などの特殊文字を &lt; &gt; に変換し置換します

$replacement = 'stripslashes(htmlspecialchars($data["$1"]))';


// 拡張子.numberは3桁ごとのカンマで区切に変換し置換します
// 拡張子.brは改行を <br /> に変換して置換します

$replacement = 'stripslashes($2($data["$1"]))';
 
戻る 連想配列 HTMLテンプレート 次へ 繰り返し
 
△画面上