PHP で HTML などを複数行表示させたい時、ヒアドキュメントを用いることが多いですが、
出力時に htmlspecialchars() 等の関数を使っておく必要が有る場合が殆どで、
現実的には次のようなソースになってしまいます。
<?php
//実際には動作しません
$str1 = getSomeText();
$str2 = getSomeText();
$str1 = htmlspecialchars($str1, ENT_QUOTES);
$str2 = htmlspecialchars($str2, ENT_QUOTES);
echo <<<EOD
<p>{$str1}</p>
<p>{$str2}</p>
EOD;
exit;
「<p>{htmlspecialchars($str1)}</p>」のように出来れば楽なのですが、ヒアドキュメント内で関数は直接使えないため、
前もって処理しておく必要があります。
例では2つしか無いのでこれでもいいですが、何十個も処理するのはあまり綺麗とはいえません。
解決方法は2つあり、ひとつはこちらの記事(http://blog.half-moon.org/archives/390)で知ったメンバ関数を経由する方法です。
<?php
class Foo {
function h($str){
return htmlspecialchars($str, ENT_QUOTES);
}
}
$foo = new Foo();
$str = "<'sample'>";
echo <<<EOD
<p>{$foo->h($str)}</p>
EOD;
exit;
このようにするとメンバ関数は展開されるので見た目をすっきり書くことができます。
もう一つは可変変数を使う方法です
<?php
$h='htmlspecialchars';
$str = "<'test'>";
echo <<<EOD
<p>{$h($str, ENT_QUOTES)}</p>
EOD;
exit;
クラスを作らなくていい分短いソースでできますが、
なんとなく落ち着かないのは私だけでしょうか?
どちらの方法もややトリッキーな方法であるため、複数人で作業する場合などは
通常通り出力前に変換しておく方法をとったほうが無難かもしれません。
あくまでこういう方法もあるという紹介にとどめておきます。
Similar Posts:
- [PHP]htmlspecialchars()を行った上でprintf()する
- [PHP]htmlspecialchars()を使うと文字が消える?
- [PHP]PHPプログラミング学習者が陥りやすい10の失敗
- [PHP]メソッドチェーン
- [PHP]投稿数や出現回数に応じて文字サイズが変わるタグクラウド
- [PHP][jQuery]Ajax(非同期通信)を使ったチャット
- [PHP]テキストに自動で段落分け<p>、改行<br />タグをつける(文字列のHTML化)
- [PHP]よくあるエラーメッセージの原因と対処法 2