Smartyで改行が削除できない問題を解決

smarty_return_title.png

ユーザーが入力したデータから改行コードを削除して表示させたい場合、こうやるとダメ、こうやると良い方法を書いていきたいと思います。

文字コードで失敗することもある

単純にやりがちなのが、文字列置換の「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