• ベストアンサー

フォームの太字を置き換える

更新記録CGIみたいなものを改造しようとしています。 文章の一部に太字を入れたいと思っています。 入力・修正画面ではフォーム内で<B></B>と出れば良いですが、表示部分でそのまま出ると駄目ですよね。 そこで置き換えようと思ったのですが、うまく出来ません。 $com1 = ~ s/&lt;B&gt;/<B>/g; $com1 = ~ s/&lt;/B&gt;/</B>/g; とすると、$com1の内容が表示されなくなります。(他の部分は正常に表示している) 両方をコメントアウトすると、「&lt;B&gt;」と表示されます。 こういう場合、どのようにしたら良いのでしょうか?

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

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

>(ソースで見ても表示されてない) なんか別の問題でしょうかね。 全体を把握しないで、とりあえず改造って事なら、 ファイルに保存するのはそのままにしといて、 表示する時に b タグのみ有効って事で、表示する前に $com1 =~ s{&lt;(/?b)&gt;}{<$1>}ig; てしてみたらどうでしょうかね。 >$in{'com1'} =~ s/&lt;/</g; >$in{'com1'} =~ s/&gt;/>/g; いわゆるサニタイズってヤツ考えると、 これは、ちょっとマズイかもですね。

その他の回答 (3)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

何度もすみません。 = と ~ はくっつけて書きましょう。 コピペしちゃったんで、スペース入っちゃいましたすみません。 結構悩みました… $com1 =~ s/&lt;B&gt;/<B>/g; $com1 =~ s/&lt;/B&gt;/</B>/g;

master-3rd
質問者

補足

返答ありがとうございます。 あれから色々と考えて、逆転の発想をしてみました。 ログに書き込むときに<B>にしてしまえば良いじゃないかってことで、入力後の記事保存手前で、 $in{'com1'} =~ s/&lt;/</g; $in{'com1'} =~ s/&gt;/>/g; と入れました。 そうすると、ばっちり表示画面で太字が適用になりました。 しかし、別の問題が… 今度は修正画面で<B>が表示されません。 (ソースで見ても表示されてない) 色々探してると、デコード処理のところに以下のものが… # タグ処理  $val =~ s/&/&amp;/g;  $val =~ s/"/&quot;/g;  $val =~ s/</&lt;/g;  $val =~ s/>/&gt;/g; # 改行処理 if ($key eq "com1" || $key eq "com2" ) {  $val =~ s/\r\n/<br>/g;  $val =~ s/\r/<br>/g;  $val =~ s/\n/<br>/g; } else {  $val =~ s/\r//g;  $val =~ s/\n//g; } これがもしかして何か関係しているでしょうか?

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

うーん何ででしょね? とりあえず、こんな感じで動きましたけど。 #! perl use strict; use warnings; my $str = << 'END_OF_HTML'; &lt;b&gt;ほかほかカレー&lt;/b&gt; &lt;b&gt; できたてカレー &lt;/b&gt; END_OF_HTML $str =~ s|&lt;b&gt;|<b>|g; $str =~ s|&lt;/b&gt;|</b>|g; print $str; __END__

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

とりあえず、/ をエスケープしてみてはどうでしょう。 $com1 = ~ s/&lt;\/B&gt;/<\/B>/g;

master-3rd
質問者

補足

返答ありがとうございます。 エスケープしてみましたが、「4294967295」と表示されてしまいました。 $comの中にはそのような文字列は無く、???です。 ---現在の状況--- $com1 = ~ s/&lt;B&gt;/<B>/g; $com1 = ~ s/&lt;\/B&gt;/<\/B>/g; $com1画表示される場所に「4294967295」と表示 ログの$com1 : s/&lt;B&gt;ほかほかカレーs/&lt;/B&gt;