json_encode() には特殊な文字をエスケープするオプションが用意されているので、htmlspecialchars() は使わず、そのオプションを使った方がシンプルです。
下記サンプルの JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
部分がそのオプションを指定しているところです。詳しくは公式リファレンスを見てください。
php
1<?php
2 // ダミーデータ
3 $res = ['title'=> '<html>', 'name'=>'"YOUR NAME"', 'subtitle'=>'<!-- no subtitle -->', 'memo'=>'$quot;memo$quot;'];
4
5 $arr = [
6 'title' => $res['title'],
7 'name' => $res['name'],
8 'subtitle' => $res['subtitle'],
9 'memo' => $res['memo']
10 ];
11 $json = json_encode($arr, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
12?>
13<!DOCTYPE html>
14<html lang="ja">
15 <header>
16 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
17 <script type="application/json" id="json-content"><?= $json ?></script>
18 </header>
19 <body>
20 </body>
21 <script>
22 var data = JSON.parse(document.getElementById("json-content").textContent);
23 alert(JSON.stringify(data,null,'\t')); // デバッグ出力用
24 </script>
25</html>
で出力した後は、JavaScript 側でJSONを読んでオブジェクトに変換してから利用してあげればOKです。
ちなみに提示いただいたコードでは配列格納時に htmlspecialchars() を行っていますが、早々にエスケープしてしまうと、エスケープしたことで値の比較や検索ができなくなったり、二重にエスケープして出力しまったりといったトラブルの元になるため、基本的に文字のエスケープは最後の最後、HTML出力時(表示時)にするのが鉄則です。今回の例では echo htmlspecialchars($jsonTest, ENT_QUOTES, 'UTF-8');
と echo するときにエスケープすべきでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。