- ベストアンサー
CGIのtextareaへのタグの表示
- CGI(Perl)でWebのメモ帳のようなプログラムを作っています。
- 初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と < >がどちらも <>に変換されてしまい、説明中の HTMLタグ文字列がタグになってしまいます。例えば、最初の記入時「< a href・・・ > はリンクタグ」などと記入してアップロードすると、再表示するとブラウザが「<a href・・・ >はリンクタグ」と表示します。
- このような問題を解決するために、textarea 内でのタグ表示には特殊な文字列を使用する方法があります。例えば、「<<」を「<」に変換して送信し、CGIが「<<」を受け取ったら「<」に変換してログに記録するようなローカルな方法が考えられます。しかし、よりスマートな方法はまだ定石化されていないようです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
HTML::Entities の encode と decode 、もしくは CGI.pm の escapeHTML と unescapeHTML use HTML::Entities; use CGI qw(escapeHTML unescapeHTML); my $unescape = qq(<h2>"hoge"&' bar <'</h2>); print "--- use HTML::Entities::encode ---\n"; my $escape1 = HTML::Entities::encode($unescape); print $escape1, "\n"; print HTML::Entities::decode($escape1), "\n"; print "\n"; print "--- use CGI escapeHTML ---\n"; my $escape2 = escapeHTML($unescape); print $escape2, "\n"; print unescapeHTML($escape2), "\n"; --- $ perl -w foo.pl --- use HTML::Entities::encode --- <h2>"hoge"&' bar &lt;'</h2> <h2>"hoge"&' bar <'</h2> --- use CGI escapeHTML --- <h2>"hoge"&' bar &lt;'</h2> <h2>"hoge"&' bar <'</h2>
お礼
アドバイスありがとうございます。 結局、セオリー通り・・・・と言うことだと思いますが、実はベースはすでにかなりの期間使い続けている中で、たまたま気付いたバグでした(あまりタグなどは記入しないし、その編集は更にやらない)。 で元ソースをあまり変えたくないということもあり、元に戻って考えたところ、最終的には 編集画面にログを出力するときだけ "&" を &に変換して送出すれば < が &lt; などとなって textarea では元の入力通り < と表示され "<" に変換されなくなることに気付きました。 $str =~ s/&/&/g; の1行追加だけで済みましたので、この方法で逃げることにしました。