🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

4441閲覧

シングルクォーテーションとダブルクォーテーション

退会済みユーザー

退会済みユーザー

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2019/10/22 20:53

編集2019/10/22 21:04

初歩的な質問になります。すみません。
""と''の使い方についてです。
プログラミング中、値を具体的に代入するときなどに使う
'シングルクオーテーションマーク

"ダブルクオーテーションマーク
の使い方ですが、
私は
"AAAA'AAAA'AAAA"
というように
ダブルクオテーションマークの中にシングルクオーテーションマーク
(あるいはその逆)
というように使うようにしています。

"AAAA'AAAA'AAAA"のように " 範囲の中に ' の範囲を入れることは可能ですが、

(AAAA(AAAA(AAAA)AAAA)AAAA)  ※正しい書き方が不明なので()で表しています。

このように値1の中に値2を入れ、値2の中に値3を入れるようにするにはどうしたらいいのでしょうか。

一応、初心者的な甘い考えで
'"AAAA"AAAA'AAAA'AAAA"AAAA"'
などというように試したのですが、やはりできませんでした。
特殊なやり方があるのでしょうか。
それともそのようなことは各言語別々でないとできないのでしょうか。

具体例

以下のhtmlは私の作成しているゲームなのですが、
3行目 document.write("<?php");の最後の;
また、
16行目あたり ,
そして、
さらに下 
],
['59:59.96','xyz'],
['59:59.97','ijk'],
['59:59.98','aaa'],
['59:59.99','zzz'],
];
の最初 ], と最後 ] でエラーが発生していました。

js

1 var r=[ 2 [ 3 document.write("<?php"); 4 document.write("if (isset($_POST['message']) && $_POST['message'] != '') {"); 5 document.write('$f = fopen("message.txt", "a");'); 6 document.write('fwrite($f, htmlspecialchars($_POST["message"]) . "\n");'); 7 document.write("fclose($f);"); 8 document.write('}'); 9 document.write("?>"); 10 document.write('<form action="append.php" method="post">'); 11 document.write('<p>メッセージ: <input name="message" size="60"></p>'); 12 document.write('</form>'); 13 document.write('<pre>'); 14 document.write('<?php readfile("message.txt"); ?>'); 15 document.write('</pre>*/'); 16 , 17 document.write("<?php"); 18 document.write("if (isset($_POST['message']) && $_POST['message'] != '') {"); 19 document.write('$f = fopen("message.txt", "a");'); 20 document.write('fwrite($f, htmlspecialchars($_POST["message"]) . "\n");'); 21 document.write("fclose($f);"); 22 document.write('}'); 23 document.write("?>"); 24 document.write('<form action="append.php" method="post">'); 25 document.write('<p>メッセージ: <input name="message" size="60"></p>'); 26 document.write('</form>'); 27 document.write('<pre>'); 28 document.write('<?php readfile("message.txt"); ?>'); 29 document.write('</pre>*/'); 30 ], 31 ['59:59.96','xyz'], 32 ['59:59.97','ijk'], 33 ['59:59.98','aaa'], 34 ['59:59.99','zzz'], 35 ]; 36 var qs=[ 37 'q1', 38 ]; 39 const viewRank=()=>{ 40 document.querySelector('#rank span').innerHTML=r.map(x=>x.join(" ")).join("<br>"); 41 }; 42 window.addEventListener('DOMContentLoaded',()=>{ 43 viewRank(); 44 document.querySelector('#start').addEventListener('click',e=>{ 45 const t1=e.target; 46 const t2=document.querySelector('#a'); 47 t1.disabled=true; 48 t2.disabled=false; 49 const name=prompt("お名前を入力してください。"); 50 if(name=="") name="UnKnown"; 51 (async()=>{ 52 const s=new Date().getTime(); 53 for(var i=0;i<qs.length;i++){ 54 const qStr=qs[i]; 55 document.querySelector('#q span').textContent=qStr; 56 t2.value=""; 57 t2.focus(); 58 await new Promise(resolve=>{ 59 const timerId=setInterval(()=>{ 60 if(t2.value==qStr){ 61 clearInterval(timerId); 62 resolve(); 63 } 64 },10); 65 }); 66 } 67 const e=new Date().getTime(); 68 const diff=e-s; 69 const str=(10000+diff/1000).toString(); 70 const time=str.substr(1,2)+":"+ 71 str.substr(3,5); 72 r.push([time,name]); 73 r=await r.sort((x,y)=>x[0]>y[0]?1:-1).splice(0,5); 74 viewRank(); 75 t1.disabled=false; 76 t2.disabled=true; 77 })(); 78 }); 79 });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずはじめに。
タグが「プログラミング言語」となっていますが、「プログラミング言語全般」とするとおそらく質問者さんが認識していない言語での回答が返ってくる可能性が高いです。
言語を絞ったほうが良いでしょう。

これまでの質問の経緯からPHPとJavaScript どちらの言語のことを聞いているかは別として、
二重引用符を用いた文字列内で二重引用符を「表示」したい場合、引用符を用いた文字列内で引用符を「表示」したい場合、エスケープします(調べてください)

ただ、その前に、もし提示のコードが書かれているファイルが.phpであれば色んな前提を飛ばしたうえでコードを書こうとしているので、きちんと基本を学ぶ必要があります。

PHPはサーバーサイドの言語です。
JavaScriptはクライアントサイドの言語です。
ちなみにブラウザはクライアントサイドです。

まずはURLリクエストに応じてサーバーサイドであるPHPの処理が実行されます。
そしてPHP側でechoなど「出力」の処理がある箇所が画面上に出力されます。
そして、その画面出力をブラウザが読み取って解析してブラウザ上の表示を行います。
「読み取って解析」の部分でようやくHTMLやCSSやJavaScriptだと認識されるわけです。

ですので、提示のコードはPHPとしてもJavaScriptとしても正しくありません。

PHPは[PHPタグである<?php](https://www.php.net/manual/ja/language.basic-syntax.phptags.php) 内のもの(閉じ?>は必須ではない)をPHPコードだと解釈します。

つまり、下記です。

php

1 <?php"); 2 document.write("if (isset($_POST['message']) && $_POST['message'] != '') {"); 3 document.write('$f = fopen("message.txt", "a");'); 4 document.write('fwrite($f, htmlspecialchars($_POST["message"]) . "\n");'); 5 document.write("fclose($f);"); 6 document.write('}'); 7 document.write("?>

PHPでは二重引用符または引用符内を文字列と解釈します。
ただ、これはそもそもPHPタグとして解釈されません。
なぜならPHPタグの後にスペースも改行もないため、「<?php");という文字列」として解釈されます。
つまり
上記コードはPHPコードのように見えて、「そういう一連の文字列」としてブラウザ上に出力されます。そして<script>タグ内にあるのでJavaScriptのコードとして動作しようとしますが、もちろんJavaScriptの文法にも沿っていません。

となると、「PHPのコードとしてもJavaScriptのコードとしても正しくない」ということになります。


結論としては
「PHPはdocument.write()では動かせない、JavaScriptでPHPを操作するやり方としては間違っている」となります。

画面表示した時点でPHPの役割はすべて終わっているので、
表示部分はPHPから直接HTMLを作ってechoするか、どうしてもJavaScriptから扱いたければ、Ajaxから非同期で実行してPHPからはデータだけ受け取るようにするか(データの保存を行いたいならそこもAjaxにする) になります。

そのあたりを一度整理しなおしたほうが良いでしょう。

投稿2019/10/22 21:21

編集2019/10/23 02:18
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 22:05

エスケープシーケンスではなくただのエスケープでは?
m.ts10806

2019/10/22 22:33 編集

実現したいことが不明瞭な部分があったので決め打ちしてます。 コードとして生かしたいならシーケンスになるかなと(よく見たら「表示」って書いてますね私。)。 いずれにしてもそれ以前の問題なのであまりエスケープ云々は今回大事ではなさそうに思っています。
think49

2019/10/22 23:54

@te2ji さんの指摘は、「『"』は制御文字ではないので、『\"』をエスケープシーケンスとは呼べない」という指摘かと思いますが、 https://ja.m.wikipedia.org/wiki/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9 > エスケープシーケンス (escape sequence) とは、コンピュータシステムにおいて、通常の文字列では表せない特殊な文字や機能を、規定された特別な文字の並びにより表したもの。 JavaScriptにおいてのダブルコーテーションで括られた文字列リテラル上では、「"」は「通常の文字列では表せない特殊な文字」と解釈出来なくもなく、信頼性の高い情報源としては、どこを参照すべきか迷う部分はあります。
m.ts10806

2019/10/22 23:56

補足ありがとうございます。 ちょっと誤解していました。勉強になります。
退会済みユーザー

退会済みユーザー

2019/10/23 02:13

エスケープシーケンスは、制御文字であることをエスケープ文字と合わせて表現することで、今回は、" と ' を制御用(?)文字列ではないよ。ってただの文字列扱いするのでちょっと違う意味になるかと。表現としてはただのエスケープが適切だと思います。
m.ts10806

2019/10/23 02:19

後れ馳せながら「エスケープします」に文言調整しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問