No.5ベストアンサー
- 回答日時:
本題の \に関しての回答は、ほとんどしてませんのでスルーでお願いします。
> header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
これを書いた張本人の俺が説明もなしに、ソースぶん投げっぱなしにしたのが良くなかったみたいで申し訳ないです。
既に 一通り説明されているようですし、俺が口を出すと 余計混乱させてしまう気もするのですが、一応 書いてみます。
> でも。。。どうして¥””と二回も”があるのでしょうか・・・。
最初の\"が、「文字としての"」で、次の"は 「文字列を括る為の"」です。
どちらかというと "\"" で 1セットです。
ダブルクォートで括られたダブルクォートという事です。
ちなみに、更に 混乱させる事を書いちゃっていいでしょうか?
そちらのソースに合わせたので、この書き方なだけで、本当は 俺なら 微妙に別な書き方します。
header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
↓
header('Content-Disposition: attachment; filename="' . $filename . '"');
シングルクォートとダブルクォートが、混在してますので注意してください。
シングルクォートで括る事によって、ダブルクォートをエスケープさせずに使用できます。
シングルクォートもダブルクォートと同じような使い方が出来るものですが、シングルクォートの場合、変数を展開しなかったりしますので、ご注意を。
bm_hiroさんまたのご回答ありがとうございます!
最初が文字としての””次が文字列を括るための”はわかりました。^^
つまり"”test.mp3"" ってやってるんですよね。
filename="test.mp3" では動くけれどfilename=$filenameではもちろん動かない、それでfilename=" .$filename." なぜか動かない・・・。
filename="".$filename."" 基本こんな感じ・・・?(あるいはfilename="'$filename.'" )
エスケープ処理を施してfilename=\"".$filename."\"
・・・なんとなくわかってきました。
filename="" 必ず””が必要。filenameに$filenameを入れるには$filenameに ””を付けることが必要。というわけで二回必要なんですね。
わかりました^^
No.4
- 回答日時:
>header("Content-Disposition: attachment; filename=\"" . $filename . "\"")
これも同じような話です。
$filename と言う変数の値をダブルクォート「"」で括りたいのです。
例えば、$filename に「hoge.txt」と言う値が入っていたとしたら、headerの内容を
Content-Disposition: attachment; filename="hoge.txt"
にしたいわけです。
もっと単純な例で書きましょう。
""
↑
例えば、このダブルクォートの間に文字列を入れたいんだけど、入れたい文字列がダブルクォート1文字「"」だったらどうすればよいでしょう?
""" だとエラーになります。
で、答えは、"\"" です。
要するに
「"」は本来は文字列リテラルを括る特殊な記号なんだけど、\を前に付けているから、ただの「"」と言う文字列として扱ってね。エラーにしないでね。
とPHPにお願いしているわけです。
※言語によっては、""" でもOKだったりします。
重ね重ねありがとうございます!
よくわかりました。とっても勉強になりました^^
でも。。。どうして¥””と二回も”があるのでしょうか・・・。
また改めて質問します。
No.3
- 回答日時:
本当はANo.1さんの回答が全てなのだが、理解を助けるために少し補足説明しよう。
\ (円マークまたはバックスラッシュ)が文字列の中で使われると、文字として表せない文字を表現する事になる。
文字として表せないものの例:
1.改行 (\n)
2.ダブルコーテーション (\")
3.シングルコーテーション (\')
4.円マーク自身 (\\)
1は、たとえばこんな事をしてもだめなわけだ。
$str = "あああいいい
ううう
えええ";
ではどうするかという事で、
$str = "あああいいい\nううう\nえええ";
こうなる。「改行」という概念を円マークと半角小文字のnという2文字で表現できる訳だな。
そうすると2もわかるだろう。文字列を表す記号がダブルコーテーションである以上、
$str = "あああ"いいい";
とするとPHPは「あ」と「い」の間にある「"」が文字列の終わりを意図しているのか、文字列の中にダブルコーテーションを入れたいのかが分からない。なのでこうする。
$str = "あああ\"いいい";
これでPHPは「\"」と「"」によって文字列の終わりかダブルコーテーションを文字列中に入れたいのかが判断できる訳だ。
3番がなぜ必要かというのはもう少し理解を深めてからだろう。いつかステップアップしようとするとき、PHPにおいて文字列とはどう表現するのか(ダブルコーテーションでくくる以外にどう表現できるのか)という事を調べてみていただきたい。
4番ももうばっちりだな。円マークが次に続く文字と合体して何かを表す以上、円マーク自身を意味する別の表現が必要になる。それが円マーク円マークって訳。
$str = "あああ\nいいい";
は、あああ改行いいいを表すが、
$str = "あああ\\nいいい"
は、あああ円マークエヌいいいと解釈される。
No.2
- 回答日時:
いわゆるエスケープ処理です。
どの言語にも多かれ少なかれあります。http://php.net/manual/ja/language.types.string.php
今回の例示ですと、ダブルコーテーションのくくりのなかにある
ダブルコーテーションを\をつけてエスケープしてます。
たとえば
print "a\"b";
とすれば出力は「a"b」と表示されます。
これをエスケープしないと
print "a"b";
となり、文字列をくくっているのか文字列として表示したいのかわかりません。
(文法的にエラーになります。)
No.1
- 回答日時:
¥マーク(バックスラッシュ)は、エスケープ文字と言って、特殊な制御文字を文字として識別するためのものです。
例えば、ご質問の元になったのは、こんな例をご覧になったからではありませんか?
↓
// PHP
echo "Hello, World!\n";
\nと書いた場合、これは「改行」を意味するようになります。
上記の例であれば「Hello, World!」と標準出力に表示した後、さらに改行を表示します。
因みに、このバックスラッシュは、C言語でもPerlでもJavaでもPHPでも同じ意味を持ちます。
(元々はC言語から来た概念)
↓
/* C言語 */
printf("Hello, World!\n");
// Java ※
system.out.print("Hello world!\n");
※Javaの場合はprintlnを使う場合が多いので、この書き方はあまりしませんが。
ありがとうございます!
自分がみたやつはちょっと違うみたいなんです???
header("Content-Disposition: attachment; filename=\"" . $filename . "\"")
これなんですが、意味がわかんないのです。
教えてくださいませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP WordpressのPHPを安全に編集する方法 1 2022/08/04 01:43
- PHP HTMLのINPUTから画面表示 3 2023/04/04 21:34
- WordPress(ワードプレス) Wordpressをハッキングされない方法 4 2022/06/11 04:15
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- WordPress(ワードプレス) CMSでJoomlaとDrupalを検討していますが どちらが敷居低いでしょうか? プラグインが多い 1 2023/05/13 23:01
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP PHP MySql ページング 2 2022/09/20 06:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSで"をエスケープする文字は?
-
2バイトローマ数字小文字につ...
-
php 正規表現で、\\マークを取...
-
ダブルコーテーション(
-
○分から○時間○分に変換
-
PHPの¥
-
文字列の括弧について(初心者)
-
正規表現ereg_replaceで、ダブ...
-
【php】二進数をフラグとして扱...
-
エスケープ文字の復帰(¥r)と...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
C++で空Enterの入力を判...
-
カンマの含まれる文字列の数値...
-
Excel VBAからBeckyを起動して...
-
文字の入力で横バー上段、中断...
-
JAVA System.out.println の ...
-
POSTで改行コードを受け渡すには
-
改行を読み飛ばす
-
半角記号、全角記号を含む正規...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
VBSで"をエスケープする文字は?
-
PHP・Wordpress preg_replaceを...
-
文字列の置換をCStringで(C++)
-
○分から○時間○分に変換
-
近似した文字列を置換するエク...
-
文字列の括弧について(初心者)
-
PHPの¥
-
ダブルクォーテーションが置換...
-
php 正規表現で、\\マークを取...
-
(から)までの文字列を削除したい
-
nl2brが効かないのですが・・・
-
文字列のアスタリスク置換
-
htmlspecialchars関数でエスケ...
-
PHPでCSVを出力する際のセルに...
-
c# string型の変数に、ダブルク...
-
正規表現で<BR>の行を除外した...
-
ダブル、シングルクォーテーシ...
-
Pukiwikiの編集にて#や-を無効...
-
空白文字のカンマへの変換について
おすすめ情報