質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3496閲覧

JavaScriptの連想配列オブジェクトを、PHPの連想配列に変換したいです

yabatan

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/16 06:14

前提・実現したいこと

JavaScriptの連想配列オブジェクトとしては有効な形式を、PHPでも有効な形式にデコードしたいです。

PHPではダブルクオートで囲まれていないとjson_decodeが効かないなどのルールがあると思うのですが、そういった点をクリアしたいです。

該当のソースコード

まず次のHTMLが与えられます。ここからjsObjを取得し、PHPで各値を取得していきたいわけです。

<!DOCTYPE html> <html> <head> <title></title> <meta name="color" content="#fff"> <script type="text/javascript"> var jsObj = { // comment id: 123, current: {"type":"get","id":111}, is_clear: null, date: {'created':"It's hard things"}, has: true, info: [{url:null,"bool":false,}], from: "page", url: "http://example.com" + "/page/a", item: "pc", // xxx: note - please help me }; </script> </head> <body> <p>This is page</p> </body> </html>

試したこと

jsObj の取得は以下でできそうです。

php

1$jsObj = ''; 2$html = '上記HTMLが入る'; 3$doc = new DOMDocument(); 4$doc->loadHTML($html); 5$script_tags = $doc->getElementsByTagName('script'); 6for ($i = 0; $i < $script_tags->length; $i++) { 7 $script = trim( $script_tags->item($i)->nodeValue ); 8 $key = 'jsObj'; 9 if( preg_match( "[var\s$key\s=\s(.+)]", $script, $matches ) ){ 10 $jsObj = $matches[1]; 11 } 12} 13var_dump($jsObj);

あとは以下のように、art_idなどの必要値を取得していきたいわけですが、コメントにあるようにうまくいかないわけです。

php

1$jsObj= json_decode($jsObj,true); // ダブルクオートで囲まれていないなどPHP側のルールに準拠していないためNULLとなる 2echo $jsObj["id"] ?? "値がない"; // "123" がほしいが "値がない" がechoされてしまう

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

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

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

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

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

guest

回答3

0

ベストアンサー

要件

いや、与えられるHTMLは変えないでください。質問は以下にある通りです。

まず次のHTMLが与えられます。ここからjsObjを取得し、PHPで各値を取得していきたいわけです。

要するに、JavaScriptコードの字句解析を行いたいわけですね。

(1) ES2020

まず、各種構文を参照して、ABNFを確認します。

(2) ABNF

次に、ABNFの文書を読んで解読します。

(3) 正規表現

最後に、ABNFを正規表現に変換して、コードを書きます。

Re: yabatan さん

投稿2020/08/16 11:14

編集2020/08/16 13:08
think49

総合スコア18194

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

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

yabatan

2020/08/16 11:25

なるほどいけそうです。具体的なリンクと方向性をありがとうございました。
think49

2020/08/16 13:11

コメントが抜けていたので、親記事に追記しました。
guest

0

JavaScript Literal の字句解析機能を独自実装しない限り、不可能と思います。

json_decode の「変更履歴」を見ると、7.0.0以降のバージョンでは厳密にJSONを解釈するようになっています。

RFC 7159 と非互換の数値フォーマットは拒むようになりました。

PHP 5.6 までは簡単に実現できたようです。

本題を解決できるコードに感じましたが

php

1$foo = json_decode( stripslashes( $foo ) );

現在のPHPですと yambejp さんの回答通りと思います。

htmlを解析するならjsonっぽいデータを予め意識してhtml(js)を

書かないといけません

PHP の DOMDocument(); でも、JavaScriptでもJSONとして扱うため script[type=text/json] をマークアップしておくというアイディアは思いつきましたが、与えられるHTMLは変えないのが条件なのですよね。

一応、アイディアだけ

html

1<!DOCTYPE html> 2<html> 3<head> 4 <title></title> 5 <meta name="color" content="#fff"> 6 <!-- 以下のように、JavaScript コメント、演算が使えなくなる --> 7 <script type="text/json"> 8 { 9 "id": 123, 10 "current": {"type":"get","id":111}, 11 "is_clear": null, 12 "date": {'created':"It's hard things"}, 13 "has": true, 14 "info": [{url:null,"bool":false}], 15 "from": "page", 16 "url": "http://example.com/page/a", 17 "item": "pc" 18 } 19 </script> 20 <script type="text/javascript"> 21 var json = document.querySelector("script[type$=json]").textContent; 22 var jsObj = JSON.parse(json); 23 </script> 24</head> 25<body> 26 <p>This is page</p> 27</body> 28</html>

投稿2020/08/16 09:35

編集2020/08/16 09:46
AkitoshiManabe

総合スコア5434

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

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

maisumakun

2020/08/16 09:43

PHP 6はキャンセルになったので、PHP 7の直前は5.6です。
AkitoshiManabe

2020/08/16 09:45

ご指摘ありがとう御座います。回答を訂正しました。
guest

0

ajaxやfetchでJSON.stringifyしたデータを渡しすのが普通です
htmlを解析するならjsonっぽいデータを予め意識してhtml(js)を
書かないといけません

投稿2020/08/16 06:32

編集2020/08/16 06:33
yambejp

総合スコア117707

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

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

yabatan

2020/08/16 06:35

普通そうですよね。
yambejp

2020/08/16 06:55 編集

逆にあらかじめjsonでもたすという考え方もあります var jsObj = JSON.parse(`{"id":123,"current":{"type":"get","id":111},"is_clear":null,"date":{"created":"It's hard things"},"has":true,"info":[{"url":null,"bool":false}],"from":"page","url":"http://example.com/page/a","item":"pc"}`); console.log(jsObj); JSON.parse(`この間がjsonデータ`);
yabatan

2020/08/16 07:17

いや、与えられるHTMLは変えないでください。質問は以下にある通りです。 >まず次のHTMLが与えられます。ここからjsObjを取得し、PHPで各値を取得していきたいわけです。
yambejp

2020/08/16 07:33 編集

そういう意味ではHTMLにかかれているものがjsonではないので 困難です。 式が書かれたりしているのでPHP側の解釈にも限度があるでしょう。 スキルと根気がないなら早めに諦めることをおすすめします
yabatan

2020/08/16 08:13

これは申し訳ございません。私の言い方が悪かったんですね。 お詫びしますので気持ちよくいきましょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問