A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
> cgi内では"は使用できませんよね?
そんなことは無いです。ちゃんと使用できますよ。
ダブルクォートで囲んだ文字列の中にダブルクォートを入れる場合、
$str = "<IMG src=\"xxx\">\n";
のように、「\」を使ってエスケープすれば大丈夫です。
ただ、この方法でHTMLを書くと \ だらけで大変見にくくなってしまうので、「ヒアドキュメント」や「qq 演算子」(または「q 演算子」)を使うことが多いです。
No.1では qq を使って「qq{文字列}」のように書きましたが、{ と } の部分は、他の種類のカッコか、別の記号文字でも構いません。
詳しくは参考書などで調べてみてください。
次に chr2ref 関数について。
「文字参照」は知ってますよね?(< や & など)
フォームのvalue内の一部の文字参照は、送信時に文字実体となって送信されます。
つまり、
<INPUT type="hidden" name="a" value="b&c">
という hiddenフォームの値を受け取ると
a=b%26c (「%26」をデコードすると「&」)
となっています。
もちろん、value="b&c" でも大丈夫ですが、前述のダブルクォートや文字参照自身を書きたい場合には必要です。
例えば「<」自身を出力する場合は「&lt;」としなければなりません。
通常の文字列を書き出す際に chr2ref を通すことは、フォームだけでなくHTML全体において有効ですが、受け取ったフォームの値を使う場合には注意が必要です。
なぜなら、掲示板のような‘入力された値をHTMLに出力するCGI’では、たいていの場合、入力された < や > をデコードの時点で文字参照に変換しているのです。
文字参照化されている文字列を chr2ref に通すと、
入力値 <
↓
デコード <
↓
chr2ref &lt;
となってしまいます。
もしデコードで文字参照化を行っていなければ、No.1のお礼のやり方で問題ありません。
行っている場合は chr2ref は必要ないわけですが、デコードの文字参照化がちゃんと &、<、>、" の4文字を対象にしているか確認して下さい。
中途半端に < と > しかやっていないと、うまく行かないことがあります。
また、必ず & → & の変換を最初に行って下さい。でないと < → < → &lt; となってしまいます。
No.1
- 回答日時:
フォームのvalue値をシングルクォートで囲んでいませんか?
例えば、
<INPUT type=hidden name=a value='X'mas'>
のようにすると、「value='X'」と その他の属性「mas'」であるかのように認識され、X しか送信されません。
回避するには value='X\'mas' のようにすればよいでしょう。
ただし、本来ならシングルクォートではなくダブルクォートで囲み、中のダブルクォートは文字参照(")に変換するべきです。
(同様に、&、<、> の変換も必要)
なので、そのような文字参照への変換関数を1つ作っておき、HTMLへの出力する値はその関数を通すようにしてはどうでしょう?
sub chr2ref {
local($_) = @_;
s/&/&/g; s/</</g; s/>/>/g; s/"/"/g;
$_;
}
print qq{<INPUT type="hidden" name="a" value="}, chr2ref("X'mas"), qq{">\n};
回答ありがとうございます。
実際の書込みはcgiによるデータの送受信で行っているのですが、
その場合も
chr2ref("$FORM{'hogehoge'}")・・
のようにしてしまってもOKなのでしょうか?
またダブルクォーテーションを使用したかったのですが、cgi内では"は使用できませんよね?それで安易に'を使用してしまったのですが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス フォームの自動入力 1 2023/03/20 00:18
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- Chrome(クローム) 入力フォームの履歴を消したい 2 2023/06/29 13:02
- その他(Microsoft Office) Excelで総数量を変動させたい 2 2022/11/04 23:49
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- Access(アクセス) Accessフォームで複数条件でフィールドの値を表示する方法 4 2022/07/21 10:47
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- Excel(エクセル) エクセルのファームにプルダウン設置できますか? 2 2022/05/19 23:38
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
ラズパイで感圧センサーを動か...
-
【C#】数値の範囲チェックについて
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
16進の10進変換について
-
実行時エラー 3020の対策
-
文字の横にプルダウンを表示さ...
-
デ-タテ-ブルの内容での更新...
-
セレクトメニューで2つの項目...
-
数値英単語変換
-
セレクトボックスのselected属...
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
【メモリ不足で落ちる(python)】
-
STLのlistで重複するものだけを...
-
【至急!!!】python言語で本を見...
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
フォームで入力した値を表示し...
-
【C#】数値の範囲チェックについて
-
ラズパイで感圧センサーを動か...
-
linq で 楽天ウェブサービスのX...
-
Perlでアルファベットを数...
-
CGIでのページ指定~その(2)
-
途中まで出来ているのですが‥(D...
-
CGIやPHPで外部ファイルの内容...
-
CGIからメールに書き出しする際...
-
デコードできない時があります><
-
gpioを使ってSPIをシミュレーシ...
-
フォームのINPUT NAM...
-
map(STL)でinsertを行いたいで...
-
Application.ScreenUpdating = ...
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
おすすめ情報