タグの不等号処理に関する問題

このQ&Aのポイント
  • perlを使用して掲示板を作成していますが、タグなどで使用する不等号を変換できません。
  • 現在の処理では、不等号を正しく変換することができません。
  • タグとして認識されてしまい表示に問題が生じます。
回答を見る
  • ベストアンサー

タグの不等号処理

ただいまperlにて掲示板を製作中です。PC上でApacheを使いチェック中なのですが、タグなどで仕様する不等号を変換することが出来ません。下記のように処理しているのですが、なぜか変換されません。 foreach (@data){ s/&/&amp;/g; s/>/&gt;/g; s/</&lt;/g; s/"/&quot;/g; s/\r\n/\<br\>/g; s/\n/\<br\>/g; } ちなみにs/&/&amp;/g;の[&amp;]の部分を[AA]等に変更すると 問題なく[&]は[AA]に変更されます。 なぜなのでしょうか?表示時にタグとして認識されてしまい困っております。どうかご教授下さい。

  • CGI
  • 回答数7
  • ありがとう数4

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.7

>(3)→(4)への受け渡し時に問題があるようです。 同一CGIでの処理かと思っていましたが、 (3)ブラウザで表示→フォーム送信→CGIで受け取る(4) ですか? >つまり、ブラウザを通すとデコードされます。 #5の回答に書きましたが、そういうことです。 ブラウザを通した段階で、デコードされますので、(4)で再度エンコードの必要があります。 >splitで分割した物も$writelogに反映されてしまうのでしょうか? splitしたものは、別の変数に入れてますよね?これは関係ないと思います。 >(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、 そのままとは、 $writelogをformのhiddenで渡しているって事でしょうか?何にしろ、ブラウザがHTMLを解釈する段階でデコードされますので、ブラウザを経由したら再度エンコードの必要がありますよ。 >ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。 これは必要な処理ですね。問題解決かな。 お疲れ様でした。

tetsu222
質問者

お礼

有難うございました! その通りhiddenで渡してました。 てっきり出力はされていないので大丈夫だと思っていました。 しかしhiddenで受け渡してもダメだったのですね。 親切に有難うございました。

その他の回答 (6)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.6

再度の補足有難うございます。しかし、疑問は深まる一方です。(^^; 説明のため番号を付けて置きます。 (1) 名前(name) メール(mail)・・・受け取ります。 (2) 置換をします、@dateをjoinして($writelog)します。 (3) $writelogをsplitし一度でブラウザに表示します。 (4) $writelogをログファイルに書き込む。 フォームで名前を <b>aaa</b> と入力したとします。 (3)のブラウザ上の表示は  (a) <b>aaa</b>  (b) aaa (太字)  (c) &lt;b&gt;aaa&lt;/b&gt; (a)ですよね?この段階では正常ですよね? (b)なら置換されていません。 (c)にはなりません。 ひょっとして、ログファイルをブラウザで開いてます? (2)の後、(3)の後で $writelog の内容を出力してみてください。 open(IN,">>test.txt"); print IN $writelog; close IN;

tetsu222
質問者

補足

こちらこそご丁寧に有難うございます。 (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)の後それぞれ &lt;b&gt;aaa&lt;/b&gt; となりました。 (4)でも出力してみたところ <b>aaa</b>となってました。 原因はそこみたいです。 ためしに(4)の段階で再度、置換作業をしてみたところ掲示板でもうまくいきました。(3)→(4)への受け渡し時に問題があるようです。 (3)の段階でブラウザに表示する内容はsplitで分割した物を出力し(3)→(4)へは$writelogをそのまま受け渡していたので問題ないと思っていたのですが、splitで分割した物も$writelogに反映されてしまうのでしょうか?もしかして原因なのでしょうか?

  • venzou
  • ベストアンサー率71% (311/435)
回答No.5

ご存知だとは思いますが、念のため。 <html><body> &amp;aa &lt;bb&gt; &quot;cc&quot; dd<br>dd ee<br>ee </body></html> これをブラウザで表示すると &aa <bb> "cc" dd dd ee ee こうなります。つまり、ブラウザを通すとデコードされます。 >'&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"とこのままの状態でログテキストに保存されてしまします。 ログテキストとは何でしょう? この置換部分は問題ないと思いますので、置換した後、ログを書き出すまでに、ブラウザのフォームなどで再変換されているのでは? 置換してから、ログテキストを書き出すまでの流れを教えてください。

tetsu222
質問者

補足

すいません、ログテキストとは書き込まれた内容を保存しておくテキストファイルのことです。説明不足でした。 流れを書きますと、 まずブラウザ上での投稿内容を入力しその内容を 名前(name) メール(mail) タイトル(title) メッセージ(mess)として受け取ります。 ↓ 受け取った内容を@dateとして、それを置換をします(問題部分)、@dateをjoinして($writelog)します。 ↓ 投稿の内容を確認するためのサブルーチンで $writelogをsplitし一度でブラウザに表示します。 ↓ $writelogをログファイルに書き込む。 以上のような流れになっております。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

#3です。 ブラウザ上で見てますよね。 それなら、置換されてますよ。 ソースを表示して確認してください。

tetsu222
質問者

補足

失礼致しました。 No.3のお礼のところに書いてしまったのですが、 それだけで実行したところ &amp;aa &lt;bb&gt; &quot;cc&quot; 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)
回答No.3

例: @data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"); foreach (@data){ s/&/&amp;/g; s/>/&gt;/g; s/</&lt;/g; s/"/&quot;/g; s/\r\n/<br>/g; s/\n/<br>/g; } $" = "\n"; print "@data"; 結果: &amp;aa &lt;bb&gt; &quot;cc&quot; dd<br>dd ee<br>ee うちの環境では正常に置換されました。 そちらでは、実際どう置換されます? 上記の例の結果を教えてください。

tetsu222
質問者

お礼

補足の補足です。すいません open(IN,">>test.txt"); print IN"@data"; とテキストに書き出したところ、 &amp;aa &lt;bb&gt; &quot;cc&quot; 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初心者なのでまったく解らないのですが、&や不等号"等を変換してはいけない設定などあるのでしょうか?解らずにしていたなんてこともあるのでしょうか?

tetsu222
質問者

補足

下記で出力してみたところ my@data = ('&aa','<bb>','"cc"',"dd\r\ndd","ee\nee"); foreach (@data){ s/&/&amp;/g; s/>/&gt;/g; s/</&lt;/g; s/"/&quot;/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 となりました。

noname#39970
noname#39970
回答No.2

>> [>] で単一指定化 [>] [<] ["] って意味で

noname#39970
noname#39970
回答No.1

> s/>/&gt;/g; > s/</&lt;/g; > s/"/&quot;/g; 「>」「<」「"」を\でエスケープしてみるとか [>] で単一指定化してみるとか

関連するQ&A

  • CGIで改行タグを改行コードに変換ってできますか?

    CGIで改行タグを改行コードに変換ってできますか? $text =~ s/\r\n/<br>/g; $text =~ s/\r/<br>/g; $text =~ s/\n/<br>/g; で確認画面上で表示されるtextareaの文章は改行されるのですが、 届いたメールには<br>と表示されてしまって困ってます。 PHPでは変換できるみたいなのですが、perlでも出来るのでしょうか?

    • ベストアンサー
    • CGI
  • 文字実体参照が勝手に変換されてしまう

    簡単な問合せフォームを作成中に文字実体参照に変換した文字が、元に戻されてしまい困っています。簡単なサンプルを作成してみましたが、以下の様な状態です。 1.入力フォームを持ったHTMLに 「<>と&lt;と&gt;」 と入力し、xxx.cgiに渡します。 2.xxx.cgi内で入力文字列を取得し、文字実体参照に変換後<hidden>で値を保持、再度xxx.cgiに<hidden>の文字列を渡すようにします。この時点で入力値は 「&lt;&gt;と&amp;lt;と&amp;gt;」 となります。 3.再度xxx.cgiが呼ばれると、文字実体参照に変換する処理が行われる為、入力値が 「&amp;lt;&amp;gt;と&amp;amp;lt;と&amp;amp;gt;」 となるはずですが、 「&lt;&gt;と&amp;lt;と&amp;gt;」 となってしまいます(変換処理が行われているはずなのに変換されていない)不思議に思って変換前のCGIの引数を確認してみると、 「<>と&lt;と&gt;」 と文字実体参照が元に戻されてしまっています。 ちなみに文字実体参照の変換処理は$valueに対象の文字が入っているとして以下の方法で変換しています。 ---------- $value =~ s/&/&amp;/g; $value =~ s/"/&quot;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\n/<BR>/g; ---------- こういった現象についてでも何か分かるようでしたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • テキストファイルのHTMLタグを文字として表示させるには?

    テキストファイルのHTMLタグを文字として表示させるにはどうすればよいのでしょうか? <HTML>の"<"をJIS文字コードに置き換えれば良いというようなことを聞きましたが、 $_ =~ tr/</&lt);/s; この文字を置き換える式では駄目でした。 多分表記の仕方が間違っていると思うので正しいのをよろしくお願いします。 (上の置き換え文だと&HTML>になってしまいます。) #!/usr/bin/perl main:{ require "jcode.pl"; $file = 'file01.txt'; print "Content-type: text/html\n\n"; print "<HTML><BODY>\n"; print "<TITLE>表\示</TITLE>\n"; open( FH, $file) or die "Can't open"; foreach( <FH> ){ $_ =~ tr/</&lt);/s; print $_ ."<br>"; } close(FH); print "<br>_<br><"; print "</BODY></HTML>\n"; }

    • ベストアンサー
    • Perl
  • フォームで受け取った文章$strを

    HTML形式に直すには $str=~s|\r\n|<br/>|sg; $str=~s|\n|<br/>|sg; $str=~s|\r|<br/>|sg; $str=~s|\s|&nbsp;|sg; $str=~s|<|&lt;|g; $str=~s|>|&gt;|g; $str=~s|&|&amp;|g; でいいのでしょうか? 何か抜けや誤りはないでしょうか? \tの変換ができないのが残念ですが空白にしたつもりです

    • ベストアンサー
    • Perl
  • perl cgiで正規表現が無限にマッチする

    perl でcgiを作っています。フォームから受け取ったテキストから、正規表現を用いて、データを切り出そうと思っています。 以下のようなコードを書くと、マッチするのは一か所だけのはずなのに、無限回数マッチしてprintしつづけます。なにが間違っているのでしょうか。ご指導ください。 my $text = $in_data{'data_text'}; #フォームから受け取る $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; # invalidation $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; while ( $text =~ /Line(\d{1}):長さ:(\S+) km/){ print "Line$1: $2<br>"; }

    • ベストアンサー
    • Perl
  • 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
  • Windows98seから

    Niftyのサーバに次のコードを含むパールをDLして 実行(アクセス)するとエラーになります $name =~ s/\&/\&amp;/g; $name =~ s/</\&lt;/g; $name =~ s/>/\&gt;/g;#error $name =~ s/\"/\&quot;/g; #errorの行だけが問題なのですがどうすれば良いでしょうか? $name =~ s/\>/\&gt;/g; にしてもエラーです

    • ベストアンサー
    • Perl
  • MySQLにHTMLタグを挿入したい

    PHPでつくった登録フォームよりhtmlタグを入力してそれをtext型のフィールドにhtmlタグごと入れたいのですが、うまくいいようにはいりません。 入力 <table border="0" width="80%"><tr>問1 磁気ディスク装置において,磁気ヘッドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。</tr><tr> <td><input type="radio" name="1" value="ア">ア  アクセス時間</td><td><input type="radio" name="1" value="イ">イ  サーチ時間</td><td><input type="radio" name="1" value="ウ">ウ  シーク時間</td><td><input type="radio" name="1" value="エ">エ  データ転送時間</td></tr></table><br><hr width="80%"><br> フィールドの保存データ &lt;table border=&quot;0&q uot; width=&quot;80%&quot;&gt;&lt;tr&gt;問1 磁気ディスク装置において,磁気ヘッ ドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。&lt;/tr&gt;&lt ;tr&gt; &lt;td&gt;&lt;input type=&quot;radio&quot; name=&quot;1&quot; value=&qu ot;ア&quot;&gt;ア  アクセス時間&lt;/td&gt;&lt;td&gt;&lt;input type=&quot;radio &quot; name=&quot;1&quot; value=&quot;イ&quot;&gt;イ  サーチ時間&lt;/td&gt;&lt ;td&gt;&lt;input type=&quot;radio&quot; name=&quot;1&quot; value=&quot;ウ&quot;& gt;ウ  シーク時間&lt;/td&gt;&lt;td&gt;&lt;input type=&quot;radio&quot; name=&q uot;1&quot; value=&quot;エ&quot;&gt;エ  データ転送時間&lt;/td&gt;&lt;/tr&gt;&l t;/table&gt;&lt;br&gt;&lt;hr width=&quot;80%&quot;&gt;&lt;br&gt; と入ってしまい データベースを参照してhtmlを表示したときには <table border="0" width="80%"><tr>問1 磁気ディスク装置において,磁気ヘッドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。</tr><tr> <td><input type="radio" name="1" value="ア">ア  アクセス時間</td><td><input type="radio" name="1" value="イ">イ  サーチ時間</td><td><input type="radio" name="1" value="ウ">ウ  シーク時間</td><td><input type="radio" name="1" value="エ">エ  データ転送時間</td></tr></table><br><hr width="80%"><br> と表示されうまくいきません。

  • CGIで受け取った日本語文字列を正規表現で

    perlでcgiを作っています。 テキストボックスに入れてもらった文字列から正規表現で数字を抽出します。 以下のように、組むと "USA"のような半角英数はただしくマッチしますが、 "アメリカ"や"ドル"などはマッチしません。簡単に解決する方法をお教えください。 my $text = $in_data{'data_text'}; $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; if ($text =~ /USA (\d+) dollars/){ print "USA $1\n"; } if ($text =~ /アメリカ (\d+\.\d+) ドル/){ print "アメリカ $1\n"; } exit;

    • ベストアンサー
    • Perl
  • 掲示板を作成する際に・・・

    掲示板を作成する際、 文章を等間隔に表示させたいために、 文章を格納している$comに <pre>$com</pre> としてみました。 (大抵のスクリプトでは、「図/表モード」 の場合、<pre>$comment</pre>となっていたからです。) 確かにこれで文字は等間隔に表示されましたがこれだと メッセージ欄で空行(一行空けること)を入れた場合、 空行が無くなり、改行にしかなりません。 改行(とタグ)に対して以下のようにしているのですが・・・・ $com =~ s/\"/&quot;/g; $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; $com =~ s/<br>//ig; $com =~ s/\r\n/<br>/g; $com =~ s/\r/<br>/g; $com =~ s/\n/<br>/g; $com =~ s/\t/ /g; CGIとPERLはまだかじった程度の知識しかないので どうすればいいのかわからないので教えていただきたいのですが・・・。

    • ベストアンサー
    • CGI

専門家に質問してみよう