CGIのtextareaへのタグの表示

このQ&Aのポイント
  • CGI(Perl)でWebのメモ帳のようなプログラムを作っています。
  • 初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と &lt; &gt;がどちらも <>に変換されてしまい、説明中の HTMLタグ文字列がタグになってしまいます。例えば、最初の記入時「&lt; a href・・・ &gt; はリンクタグ」などと記入してアップロードすると、再表示するとブラウザが「<a href・・・ >はリンクタグ」と表示します。
  • このような問題を解決するために、textarea 内でのタグ表示には特殊な文字列を使用する方法があります。例えば、「<<」を「&lt;」に変換して送信し、CGIが「<<」を受け取ったら「&lt;」に変換してログに記録するようなローカルな方法が考えられます。しかし、よりスマートな方法はまだ定石化されていないようです。
回答を見る
  • ベストアンサー

CGIのtextareaへのタグの表示

CGI(Perl)でWebのメモ帳のようなプログラムを作っています。 何種類かのHTMLタグの使用もできるようにしてあり、更に タグ説明のために &lt; &gt; などを記入することもあります。 初回の記入をそのまま表示させる場合は問題ありませんが、一度記入した内容を 編集のためにブラウザに再表示させ、更にそれを更新すると タグの <> と &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; に変換してログ記録する などのローカルな方法を考えましたが、あまりスマートではないかと。 定石のような方法はないのでしょうか?

  • CGI
  • 回答数1
  • ありがとう数14

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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>

creative_soso
質問者

お礼

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

関連するQ&A

  • TEXTAREAの改行がうまくいきません。

    自作で掲示版を作成している、初心者です。現在作成中の掲示版にTEXTAREAに入力し、LOG上では1行目<BR>2行目といった形で改行をBRに置き換えて保存していますが、その修正としてLOGからデータをとり改行状態で表示させたいのですが、 うまく改行されない状態です。下記にLOGより読み込み。タグを\rに置き換えて いますが、TEXTAREAに表示されなく、改行表示どころではありません。 いったいどうすればよいのでしょうか?ご教示をお願いします。 <CGI文> $wkaaa1 = $IXUSERINF{Enaiyo}; データを取得 $wkaaa =~ &notag1($wkaaa1);  変換(これがおかしい?) $mesbuff .= "<TR><TD nowrap ><TEXTAREA ROW=\"10\" COLS=\"48\" NAME=\"Enaiyo\" WRAP=\"soft\">$wkaaa </TEXTAREA></TD></TR>"; <sub> sub notag1 { local($_) = @_; s/&/&amp;/g; s/"/&quot;/g; s/</&lt;/g; s/>/&gt;/g; s/&lt;br&gt;/\n/gi (これで <BR>を\n(改行)にしてるつもり return $_; }

    • ベストアンサー
    • CGI
  • textarea内のタグを反映させたいのですが

    http://okweb.jp/kotaeru.php3?q=984300を参考に 改行を犠牲にして自動リンクを利用できるようにしたのですが、 HTMLの一部に編集内容を反映したいため FONTタグ等も利用したいんです。 何か良い方法はありませんでしょうか? よろしくお願いします。 <?PHP 文字制限のため省略ですが参考元と同様です。 ?> <html> <title>テキストファイルのデータ更新</title> </head> <body> <form method="post" action="edit.php"> data1の変更 - <textarea name ="data1" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data1']); ?></textarea><br> data2の変更 - <textarea name ="data2" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data2']); ?></textarea><br> data3の変更 - <textarea name ="data3" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data3']); ?></textarea><br> <input type="submit" value="送信"> </form> <table> <tr><td>data1</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data1']); ?></td></tr> <tr><td>data2</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data2']); ?></td></tr> <tr><td>data3</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data3']); ?></td></tr> </table> </body> </html>

    • 締切済み
    • PHP
  • 広告ランダムCGI

    テキストとそのリンク先がランダムで表示できるCGIってありますか? 例えば、HTMLでタグが、 『<a href='http://www.goo.ne.jp/'>goo</a>』 というテキストリンク表示があり。 更新すると、 『<a href='http://www.yahoo.co.jp/'>Yahoo!</a>』 になっているという感じで。 もし知っている人がいればお教えください(><)

    • 締切済み
    • CGI
  • CGIの設置で、タグを記入した所に×が表示される

    アクセスログCGIを設置したのですが、アクセスログを取りたいページに下記のタグを記入したのですが、一つはタグを記入した所に×が表示され、もう一つは×が表示されません。×が表示される方のCGIを私用したいのですが、×が表示されないようにするにはどうしたらよいのでしょうか(×とは画像が表示されない時みたいな感じです) ×が表示される <script language="JavaScript"> var REF=window.document.referrer; document.writeln ("<img src=\"" + "http://.../access/acclog.cgi?ref="); document.writeln(REF); document.writeln("\" border=\"0\">" ) ; </script> ×が表示されない <SCRIPT Language="JavaScript"> <!-- document.write("<img src='http://.../accchk/access_check.cgi?"); document.write(document.referrer+"' width=1 height=1>"); //--> </SCRIPT>

    • 締切済み
    • CGI
  • HTMLにcgiを使って表示していますが、TEXTAREAの改行ができません

    今、ホームページの作成をしています。 その際入力の画面で送信ボタンを押すと、cgiを使って入力確認の画面を 表示するようにしたいのですが、入力画面のTHML言語でTEXTAREAを使うと その後の入力確認画面で入力通の改行ができません。 入力確認画面のソースを表示すると、入力画面で指定した箇所で改行はされているようなのですが、各行の最後にHTMLLの改行タグ<BR>が表示されていません。 改行タグを各行ごとに入れられれば良いのですが、どうしてもやり方が わからないので、良いやり方があれば教えていただけませんか。 cgi上ではC言語を使い、ホームページを表示しています。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 相互リンクのためのHTMLタグに関する質問です。

    おはようございます!お世話になります。^^ 相互リンクのための、HTMLタグは 同一サイトのページ内などにリンクを貼る時の一般的な下のリンクタグ <a href="リンク先ファイル名">文字列</a> でも良いのでしょうか?それとも、相互リンク専用のリンクタグがあるのでしょうか? もし、相互リンクのための特別なリンクタグがあれば教えてください。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • TEXTAREAの印刷について

    HTMLでの質問なのですが、TEXTAREAタグを用意し、画面表示させて TEXTAREAに長い文字を入力するとTEXTAREAにスクロールが出ると思います。 その時に、スクロールで表示されていない部分が、印刷されなくて 困っております。 TEXTAREAのデータ全てを印刷時に表示する方法はありますでしょうか? ブラウザは、FireFox3.6.2で表示しております。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • textareaのvalueについて

    ▽textareaの受け渡し - PHP - 教えて!goo  http://okwave.jp/qa/q3086989.html >textarea内に表示させる場合は >valueは必要ありません。 ▽[PHP-users 19095]Re: TEXTAREAタグの使い方   http://ml.php.gr.jp/pipermail/php-users/2003-November/019622.html ><TEXTAREA>のValue値は ><TEXTAREA>値</TEXTAREA> >となります。 >なので、開始タグ内でValue値を指定しても表示されません と書かれているのですが、これはHTMLの仕様なのでしょうか? また、それは、どこに書かれているのでしょうか? inputタグはvalueなのに、「textarea」タグでは何故Value値が有効でないか、教えてください。 後、jQueryで「$("textarea").val(data);」とやるのと、 PHPで、<textarea><?php echo $data ?></textarea>とやる行為に、違いはあるでしょうか? 両者は同じことをやっているという認識で良いでしょうか?

    • ベストアンサー
    • PHP
  • テキストエリア内の文字が表示されない

    PCからタグ打ちでテキストエリアを作り、 中にはリンクタグを入れました。 PCからも携帯(ドコモ)からも正常に表示されるのですが、 auのW62SHからはテキストエリア内の文字が表示されていないと言われました。 このようにしました↓ <form action="" style="margin:0;"> <textarea cols="30" rows="2" name="link"> <a href="アドレス"></a> </textarea></form> どこか間違えているのか、 それとも携帯の機種の問題でしょうか? よろしければ教えてください。 よろしくお願いいたします。

  • CGI.pmのcheckboxの-labelにHTMLタグを含んだ文字

    CGI.pmのcheckboxの-labelにHTMLタグを含んだ文字列を渡すことはできますか 具体的には、CGI.pmのcheckbox関数を使って次のような文字列を生成したいです <label><input type="checkbox" name="abc" value="xyz" accesskey="A" />abc(<span style="text-decoration: underline">A</span>)</label> 次のソースでうまくいくと思ったのですが、 $q->checkbox(-name => 'abc', -value => 'xyz', -accesskey => 'A', -label => 'abc(' . $q->span({-style => 'text-decoration: underline'}, 'A') . ')') 実際に返される文字列は、 <label><input type="checkbox" name="abc" value="xyz" accesskey="A" />abc(&lt;span style=&quot;text-decoration: underline&quot;&gt;A&lt;/span&gt;)</label> のように-labelに指定したHTMLタグが&○○;のようにエスケープされてしまいました・・・(T_T)

    • ベストアンサー
    • Perl