- ベストアンサー
タグの不等号処理に関する問題
- perlを使用して掲示板を作成していますが、タグなどで使用する不等号を変換できません。
- 現在の処理では、不等号を正しく変換することができません。
- タグとして認識されてしまい表示に問題が生じます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>(3)→(4)への受け渡し時に問題があるようです。 同一CGIでの処理かと思っていましたが、 (3)ブラウザで表示→フォーム送信→CGIで受け取る(4) ですか? >つまり、ブラウザを通すとデコードされます。 #5の回答に書きましたが、そういうことです。 ブラウザを通した段階で、デコードされますので、(4)で再度エンコードの必要があります。 >splitで分割した物も$writelogに反映されてしまうのでしょうか? splitしたものは、別の変数に入れてますよね?これは関係ないと思います。 >(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、 そのままとは、 $writelogをformのhiddenで渡しているって事でしょうか?何にしろ、ブラウザがHTMLを解釈する段階でデコードされますので、ブラウザを経由したら再度エンコードの必要がありますよ。 >ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。 これは必要な処理ですね。問題解決かな。 お疲れ様でした。
その他の回答 (6)
- venzou
- ベストアンサー率71% (311/435)
再度の補足有難うございます。しかし、疑問は深まる一方です。(^^; 説明のため番号を付けて置きます。 (1) 名前(name) メール(mail)・・・受け取ります。 (2) 置換をします、@dateをjoinして($writelog)します。 (3) $writelogをsplitし一度でブラウザに表示します。 (4) $writelogをログファイルに書き込む。 フォームで名前を <b>aaa</b> と入力したとします。 (3)のブラウザ上の表示は (a) <b>aaa</b> (b) aaa (太字) (c) <b>aaa</b> (a)ですよね?この段階では正常ですよね? (b)なら置換されていません。 (c)にはなりません。 ひょっとして、ログファイルをブラウザで開いてます? (2)の後、(3)の後で $writelog の内容を出力してみてください。 open(IN,">>test.txt"); print IN $writelog; close IN;
補足
こちらこそご丁寧に有難うございます。 (1) 名前(name) メール(mail)・・・受け取ります。 (2) 置換をします、@dateをjoinして($writelog)します。 (3) $writelogをsplitし一度でブラウザに表示します。 ※誤字がありました。すいません。一度ブラウザにです。入力内容を確認しています。 (4) $writelogをログファイルに書き込む。 ※補足この間サブルーチンを3個使用してまして(1)(2)sub1→(3)sub2→(4)sub3となっております。 >(2)の後、(3)の後で $writelog の内容を出力してみてください。 (2)の後、(3)の後それぞれ <b>aaa</b> となりました。 (4)でも出力してみたところ <b>aaa</b>となってました。 原因はそこみたいです。 ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。(3)→(4)への受け渡し時に問題があるようです。 (3)の段階でブラウザに表示する内容はsplitで分割した物を出力し(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、splitで分割した物も$writelogに反映されてしまうのでしょうか?もしかして原因なのでしょうか?
- venzou
- ベストアンサー率71% (311/435)
ご存知だとは思いますが、念のため。 <html><body> &aa <bb> "cc" dd<br>dd ee<br>ee </body></html> これをブラウザで表示すると &aa <bb> "cc" dd dd ee ee こうなります。つまり、ブラウザを通すとデコードされます。 >'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。 ログテキストとは何でしょう? この置換部分は問題ないと思いますので、置換した後、ログを書き出すまでに、ブラウザのフォームなどで再変換されているのでは? 置換してから、ログテキストを書き出すまでの流れを教えてください。
補足
すいません、ログテキストとは書き込まれた内容を保存しておくテキストファイルのことです。説明不足でした。 流れを書きますと、 まずブラウザ上での投稿内容を入力しその内容を 名前(name) メール(mail) タイトル(title) メッセージ(mess)として受け取ります。 ↓ 受け取った内容を@dateとして、それを置換をします(問題部分)、@dateをjoinして($writelog)します。 ↓ 投稿の内容を確認するためのサブルーチンで $writelogをsplitし一度でブラウザに表示します。 ↓ $writelogをログファイルに書き込む。 以上のような流れになっております。
- venzou
- ベストアンサー率71% (311/435)
#3です。 ブラウザ上で見てますよね。 それなら、置換されてますよ。 ソースを表示して確認してください。
補足
失礼致しました。 No.3のお礼のところに書いてしまったのですが、 それだけで実行したところ &aa <bb> "cc" dd<br>dd ee<br>ee となりました。 しかし製作中の掲示板cgiをですと '&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"と書き込みを してもまったく変換されず '&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。 ちなみに[AA]へ置換したところ問題なくログテキストに[AA]で保存されました。cgi初心者なのでまったく解らないのですが、&や不等号"等を変換してはいけない設定などあるのでしょうか?解らずにしていたなんてこともあるのでしょうか?
- venzou
- ベストアンサー率71% (311/435)
例: @data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"); foreach (@data){ s/&/&/g; s/>/>/g; s/</</g; s/"/"/g; s/\r\n/<br>/g; s/\n/<br>/g; } $" = "\n"; print "@data"; 結果: &aa <bb> "cc" dd<br>dd ee<br>ee うちの環境では正常に置換されました。 そちらでは、実際どう置換されます? 上記の例の結果を教えてください。
お礼
補足の補足です。すいません open(IN,">>test.txt"); print IN"@data"; とテキストに書き出したところ、 &aa <bb> "cc" dd<br>dd ee<br>ee となりました。 しかし製作中の掲示板cgiをですと '&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"と書き込みを してもまったく変換されず '&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。 ちなみに[AA]へ置換したところ問題なくログテキストに[AA]で保存されました。cgi初心者なのでまったく解らないのですが、&や不等号"等を変換してはいけない設定などあるのでしょうか?解らずにしていたなんてこともあるのでしょうか?
補足
下記で出力してみたところ my@data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"); foreach (@data){ s/&/&/g; s/>/>/g; s/</</g; s/"/"/g; s/\r\n/<br>/g; s/\n/<br>/g; } $" = "\n"; print "Content-type:text/html\n\n"; print "@data"; 結果は &aa <bb> "cc" dd dd ee ee となりました。
>> [>] で単一指定化 [>] [<] ["] って意味で
> s/>/>/g; > s/</</g; > s/"/"/g; 「>」「<」「"」を\でエスケープしてみるとか [>] で単一指定化してみるとか
お礼
有難うございました! その通りhiddenで渡してました。 てっきり出力はされていないので大丈夫だと思っていました。 しかしhiddenで受け渡してもダメだったのですね。 親切に有難うございました。