特定タグだけEscapeしないSmarty関数
Smartyを使うことが多いのですが、組み込みのescapeだと、何でもかんでもescapeされてしまうので、特定のタグだけはタグとして表示されるような関数を作ってみました。
というソースをmodifier.htmlescape.phpという名前でSmartyのPluginフォルダに放り込んでやります。<ダウンロード>
こんな感じで、テンプレートに許可したいタグ名の配列を渡しておいてやれば。
こんなかんじで、大体のaタグ、imgタグはエスケープしないでくれると思います。 もっと良い正規表現があるかもしれませんが、とりあえず。
function smarty_modifier_htmlescape($string, $arrAllowTag)
{
$string = htmlspecialchars($string);
foreach($arrAllowTag as $tag) {
$string = preg_replace_callback("/<\/?".strtolower($tag)." ?.*>/","htmlescape_unhtmlescape", $string);
$string = preg_replace_callback("/<\/?".strtoupper($tag)." ?.*>/","htmlescape_unhtmlescape", $string);
}
return $string;
}
function htmlescape_unhtmlescape($string){
$string = $string[0];
$string = str_replace("<", "<", $string);
$string = str_replace(">", ">", $string);
$string = str_replace(""", "\"", $string);
return $string;
}
というソースをmodifier.htmlescape.phpという名前でSmartyのPluginフォルダに放り込んでやります。<ダウンロード>
$smarty->assign("tag", array("img","a"));
こんな感じで、テンプレートに許可したいタグ名の配列を渡しておいてやれば。
{$message|htmlescape:$tag}
こんなかんじで、大体のaタグ、imgタグはエスケープしないでくれると思います。 もっと良い正規表現があるかもしれませんが、とりあえず。

