Smartyで改行が削除できない問題を解決
ユーザーが入力したデータから改行コードを削除して表示させたい場合、こうやるとダメ、こうやると良い方法を書いていきたいと思います。
文字コードで失敗することもある
単純にやりがちなのが、文字列置換の「replace」修飾子でやってしまうというもの。
{$mytext|replace:"n":""} {$mytext|replace:"r":""} {$mytext|replace:"rn":""}
これ、入力された文字列の文字コードeuc-jp、表示がutf-8の場合といった感じで異なる場合はうまく変換されません。
BRタグに置き換えても改行コードが残ることがある
また、改行の表示でよくやるのが「nl2br」修飾子で<br />タグに置き換えて表示する方法です。 しかしここにも文字コードによる問題が。
{$mytext|nl2br}
こうやっても、HTMLソースを見てみると改行コードが残っています。 なぜなら「nl2br」はPHPの関数をそのまま使っており、その関数マニュアルにはこう書いてあるからです。
string に含まれるすべての改行文字の前に '<br />' あるいは '<br>' を挿入して返します。
そうです。 改行コードはそのまま残す仕様なのです。 ではこれらを解決する組み合わせは?
「nl2br + strip」修飾子
改行コードを除去してくれる修飾子は「strip」で可能になります。 これに「nl2br」修飾子を組み合わせて、
{$mytext|nl2br|strip:""}
ちなみに「strip」修飾子の中身はこれ。
function smarty_modifier_strip($text, $replace = ' ') { return preg_replace('!s+!', $replace, $text); }
これで改行コードは<br />タグが挿入され、さらに改行コードは削除することができます。
さらに実用的にするには、攻撃コードの表示を防ぐための「escape」修飾子を加えて、
{$mytext|escape|nl2br|strip:""}
とすると完璧ですね。
まだ覚えて間もない人はこちらもどうぞ。
2010-10-13