掲示板CGIの自筆に挑戦中の初心者です。form から受取った データを
デコードするところで、教本やサンプルに必ず出てくる↓これですが、
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
サンプル毎の微妙な違いの意味が消化できず、混乱しています。
(上記引例は杜甫々さんのサイトから拝借しました)
<input type="text">に書いた「+」も1行目で半角sapceになるようですが、
(1)「+」は「+」として残すにはどうするのでしょう?
(2)1行目と2行目の順番が逆だと、何か結果が変わりますか?
htmlタグ不可の処理が良くわからなくて、とりあえず「=~ tr/<>/ /;」
で消しているのですが、<input type="text">に書かれた「<」や「>」を
(3)「<」「>」としてhtmlに書き出すには、どうするのですか?
tr/xx/yy/zz; とか s/xx/yy/zz; の「zz」が良くわかりません。
(4)引例の eg は、yyを実行文と解釈 (e)、かつ何度でも置換 (g) ですか?
ついでに恐縮ですが、#によるコメント化について、
(5)$color="#rrggbb"; とか $target="#ancName"; を書いても大丈夫ですか?
No.3
- 回答日時:
私も分かる範囲内で。
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg
POSTされたsjisの文字列は、URLエンコードされ、%u3042 という風になりますよね。それをCGIでデーコドする処理です。Pack関数や、hex関数はPerlリファレンス等に載っていますので、それをよく読めば処理の意味が分かると思います。
%u3042%u3044 ・・・という風に$valueに入った文字列を、hexで10進数に直し、『pack("C"』でchr型の文字へ変換している訳です。で、『/eg』は、おっしゃるとおり、pack("C",hex($1)を式と見なして、『%○○』といったパターンの文字列全てに対してpack("C",hex($1)の処理を行う、といった意味になるわけです。
また、
>htmlタグ不可の処理が良くわからなくて、とりあえず「=~ tr/<>/ /;」
>で消しているのですが、<input type="text">に書かれた「<」や「>」を
>(3)「<」「>」としてhtmlに書き出すには、どうするのですか?
ですが、「=~ tr/<>/ /;」に関しては、他の方がおっしゃるとおり、これではタグは除去できません。タグを削除したいのであれば、少なくとも
s/<.*?>//g
は必要でしょう。
また、「<」「>」を書き出すということですが、
print "<>"
で表示ではだめですか?
> Pack関数や、hex関数はPerlリファレンス等に載っていますので、//
件の1行は「お決まり」で出てくるので、理解を先送りしていますが、
ご説明を拝見し、少し「わかった気」になりました。ありがとうございます。
> s/<.*?>//g は必要でしょう。 ・・・print "<>" で表示ではだめですか//
これ↑は危ない文字は削除されますね。元質問が説明不足でしたが、html form
に入力された文字を、見た目の字面を保ってブラウザに返したかったので。
No.2ベストアンサー
- 回答日時:
では私は (1) と (2) を。
(1)
上記のスクリプトのままで、「+」は「+」として残ります。
なぜなら、上記 $value =~ tr/+/ /; の個所の $value には
URLエンコードされた文字列が入っていますので、「+」は「%2B」と
あらわされており、「 」(スペース)が「+」とあらわされています。
なので、「+」を「 」に戻してやっているわけです。
(2)
(1) の理由で、順番が逆だと、「+」が全て「 」に変換されてしまいます。
と、こんなところかと。
> URLエンコード・・・「+」は「%2B」・・・「 」(スペース)が「+」//
ブラウザのアドレスバー(Google検索とか)で見なれた%xx%yyの印象から、
英数字はエンコードされていないと思い込んでました。目から鱗です。
<form>に入力した「+」も「 」になってしまう手元の雛形は、tr/+/ /; が
%xx%yyデコードの後に書いてありました。順番を入れ替えて解決しました。
ご回答を拝見したとき、『<textarea>から送られる改行で、それを格納した
したtext file からの読み出し($\ = "\n")が撹乱』に悩んでいたのですが、
s/\n/<br>/g; に気づくキッカケとなりました。ありがとうございました。
No.1
- 回答日時:
私の解る範囲でよろしければ…
(3)
=~ tr/<>/ /;
これでは<>しか変換されないのは当たり前ですね、
=~ s/</</g;
=~ s/>/>/g;
でタグを無効に出来ます。
=~ s/"/"/g;
もやっておいた方が良いかと。
(4)
そうですね。
他にも大文字小文字を区別しない(i)とか単一行として扱う(s)なんかがあります。
(5)
大丈夫です。
""で囲まれている所はただの文字列として解釈されます。
(3) $value =~ s/</</g; $=~ s/>/>/g; で不等号は解決しました。
カッコなどのペア文字を置換するときは、置換する相手もペア文字にする
と書いてあった参考書を、「<」単独では置換できないと誤解してました。
解決後、s/x/&xxx;/; をいくつか追加したら、ブラウザに「<」のまま
出てきてビックリ。#2のご回答で記述順の意味に気づきました。後ろに
s/&/&/; を書いてしまったために、「&lt;」になってました。
(5) 変数に入れるのが不安で、いちいちhere document に直書きしてました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
常用漢字?でない文字を判定す...
-
ダブルクォート文字などをフォ...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
EXCELからCSVにすると余計なカ...
-
VBA 置換文字がみつからない時
-
マクロを使ってフォルダー内に...
-
VBA EXCEL あるセルの中の一...
-
「何とかで始まり、何とかで終...
-
pythonエラー
-
データにカンマが入ったCSVデー...
-
全角入力
-
英数字のみ全角から半角に変換
-
パイソンエラーについて
-
word差し込み印刷 半角カタカ...
-
[VBA][Excel]クリップボードか...
-
CString から LPCTSTRの型に変換
-
VBA 文字に半角が含まれて...
-
全角英数字の必要性が理解できない
-
char型全角数字から、int型半角...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
戻り値の意味がわかりません…
-
文字化けを元に戻せますか?
-
正規表現でカンマを対象にする方法
-
utf-8のマシンでsjisのデータフ...
-
unicodeの表示
-
ダブルクォート文字などをフォ...
-
チェックボックスの複数選択の...
-
jcodeを使ったgetcode
-
jcodeでsjisに変換できない
-
特殊文字をPOSTした際の動作は?
-
テキストエリアに半角「\\」ま...
-
文字化けの事で?
-
機種依存文字の文字コード変換
-
jcode.plについて
-
文字実体参照が勝手に変換され...
-
「数値文字参照への変換するソ...
-
nkfとjcodeの使い方の違いについて
-
半角と全角の文字数カウント方法
-
常用漢字?でない文字を判定す...
おすすめ情報