忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/18 17:22 |
Smarty-02 修正子

Smartyでは変数の出力時に簡単にフィルタをかけることができます。

これらは修正子と呼ばれています。
{$str|escape}
と書くと、$strにhtmlspecialchars()が適用された上で表示されます。

他に{$str|nl2br}
とすると変数内の改行が<br />に、
{$str|replace:'a':'b'}
とすると$str中の'a'が'b'に置換されて表示されます。
引数がある場合は:で区切って指定します。

また、複数の修正子を|で連結させて適用することもできます。
{$str|upper|lower}
とすると、$strを大文字に変更し、その後小文字に変更して表示します(結局小文字になる)

それ以外にも、何気にマニュアルに書かれているとおり、すべてのPHP関数を修正子として利用できます。

{$str|substr:5:3}
とするとsubstr($str,5,3)と同じ意味になります。
この場合第一引数が$str、substrの後ろが順に第二以降の引数という解釈になります。
というわけでこれを使用して、
$smarty->assign('yesterday',time()-60*60*24);
{'Y-m-d H:i:s'|date:$yesterday}
みたいな書き方もできたりします。
このような書き方は結構知られてないような気がします。
まあ普通は
{$yesterday|date_format:"%Y-%m-%d %H:%M:%S"}
としますけれども。
どうでもいいがdate_formatって名前なのにstrftimeの解釈をするのはどうなんだ。

さて、XSS対策に毎回エスケープかけるのは面倒臭い、という場合のためにデフォルトでエスケープする、というオプションがあります。
$smarty->default_modifiers=array('escape:html');
これをSmarty.phpに書いてみましょう。
この場合、出力は常にエスケープされて表示され、例外的にエスケープしたくない場合に
{$str|smarty:nodefaults}
というふうにするとエスケープせずにそのまま表示することができます。
基本的にこのオプションを使うほうが安全ですが、明示的に:escapeした方が明らかにエスケープしたとわかりやすいですし、そこは場合によると言うことで。

古いSmartyにはdefault_modifiersを指定すると配列が使えなくなるというバグがあったようですが、2.6.22では修正されているようです。

PR


2009/06/19 15:43 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<JavaScript2-9:Qtip | HOME | Smarty-01:PHPでSmarty>>
忍者ブログ[PR]