電子書籍の厳選無料作品が豊富!

CGI(Perl)でWebのメモ帳のようなプログラムを作っています。
何種類かのHTMLタグの使用もできるようにしてあり、更に タグ説明のために
< > などを記入することもあります。
初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を
編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と &lt; &gt;が
どちらも <>に変換されてしまい、説明中の HTMLタグ文字列がタグになってしまいます。
例えば
A: 最初の記入時「&lt; a href・・・ &gt; はリンクタグ」などと記入してアップロード
B: サーバーログには「&lt; a href・・・ &gt; はリンクタグ」のまま記録される
C: 編集のためにその記事を再表示させるとブラウザが「<a href・・・ >はリンクタグ」 と表示する
D: 別の部分を編集後再アップロードするとログには <a href・・・ > がタグとして記録される
E: 以降の表示では <a href・・・ > の部分がリンクタグとして扱われ「はリンクタグ」にリンクがかかる
というような問題に悩んでいます。
textarea 内では <code>タグも使えなさそうで・・・
思案の末、 textarea への送信時だけ 「 &lt; 」を 「<<」などとして送信し、CGIが「<<」を受け取ったら
&lt; に変換してログ記録する などのローカルな方法を考えましたが、あまりスマートではないかと。
定石のような方法はないのでしょうか?

A 回答 (1件)

HTML::Entities の encode と decode 、もしくは CGI.pm の escapeHTML と unescapeHTML



use HTML::Entities;
use CGI qw(escapeHTML unescapeHTML);

my $unescape = qq(<h2>"hoge"&' bar &lt;'</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 ---
&lt;h2&gt;&quot;hoge&quot;&amp;' bar &amp;lt;'&lt;/h2&gt;
<h2>"hoge"&' bar &lt;'</h2>

--- use CGI escapeHTML ---
&lt;h2&gt;&quot;hoge&quot;&amp;' bar &amp;lt;'&lt;/h2&gt;
<h2>"hoge"&' bar &lt;'</h2>
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
結局、セオリー通り・・・・と言うことだと思いますが、実はベースはすでにかなりの期間使い続けている中で、たまたま気付いたバグでした(あまりタグなどは記入しないし、その編集は更にやらない)。
で元ソースをあまり変えたくないということもあり、元に戻って考えたところ、最終的には 編集画面にログを出力するときだけ "&" を &amp;に変換して送出すれば &lt; が &amp;lt; などとなって textarea では元の入力通り &lt; と表示され "<" に変換されなくなることに気付きました。
$str =~ s/&/&amp;/g;
の1行追加だけで済みましたので、この方法で逃げることにしました。

お礼日時:2014/09/10 13:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!