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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

2回答

2303閲覧

APIで取得したデータを抽出する方法

sawareco

総合スコア18

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2019/06/20 09:20

いつもアドバイスをいただきありがとうございます。

YahooショッピングAPIを使って在庫参照をしています。下記PHPを実行しデータ自体はAPIで取得することができ、下記のように出力することに成功しました。

PHP

1$header = [ 2 'POST /ShoppingWebService/V1/getStock HTTP/1.1', 3 'Host: circus.shopping.yahooapis.jp', 4 'Authorization: Bearer ' . $refresh_token['access_token'] 5]; 6 7$url = 'https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/getStock'; 8$param = array( 9 "seller_id" => 'shop', 10 "item_code" => 'ABC12345', 11); 12 13// 必要に応じてオプションを追加してください。 14$ch = curl_init(); 15curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 16curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 17curl_setopt($ch, CURLOPT_URL, $url); 18curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 19curl_setopt($ch, CURLOPT_POST, true); 20curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); 21 22$response = curl_exec($ch); 23var_dump($response); 24curl_close($ch);

html

1<body cz-shortcut-listen="true"> 2 <resultset totalresultsavailable="1" totalresultsreturned="1" firstresultposition="1" ok="1" ng="0"> 3 <result> 4 <itemcode>ABC12345</itemcode> 5 <subcode></subcode> 6 <status>1</status> 7 <quantity>0</quantity> 8 <allowoverdraft>0</allowoverdraft> 9 <ispublished>1</ispublished> 10 <stockclose>0</stockclose> 11 <updatetime>2019-06-20T17:03:49+09:00</updatetime> 12 </result> 13 </resultset> 14</body>

この出力結果から「status」の値だけをPHPで取得したいのですが、なかなかうまくいきません・・・。何か良い方法はないでしょうか?

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

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

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

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

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

guest

回答2

0

apiがxlmを返すのでしょうか?
<status>」と「</status>」に挟まれたものが1箇所しかでてこないなら
正規表現で抜けますが、属性がふえたりしたらDOMDocumentで処理する
ほうがよいです

  • 正規表現

PHP

1$str=<<<eof 2<body cz-shortcut-listen="true"> 3 <resultset totalresultsavailable="1" totalresultsreturned="1" firstresultposition="1" ok="1" ng="0"> 4 <result> 5 <itemcode>ABC12345</itemcode> 6 <subcode></subcode> 7 <status>1</status> 8 <quantity>0</quantity> 9 <allowoverdraft>0</allowoverdraft> 10 <ispublished>1</ispublished> 11 <stockclose>0</stockclose> 12 <updatetime>2019-06-20T17:03:49+09:00</updatetime> 13 </result> 14 </resultset> 15</body> 16eof; 17 18$pattern="/(?<=<status>).*?(?=</status>)/"; 19if(preg_match($pattern,$str,$match)){ 20 print $match[0]; 21}

投稿2019/06/20 09:37

yambejp

総合スコア114814

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

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

sawareco

2019/06/20 10:29

yambejpさん アドバイスをいただき、ありがとうございます。 APIがXMLを返しているようです。($responseに格納されているようです) 教えていただいた方法をやってみました。yambejpさんのコードをコピペしたら、確かに取得することができました。 しかし、$responseに格納されているデータでやってみると取得できませんでした。 ↓ if(preg_match($pattern,$response,$match)){ print $match[0]; } また、ヒアドキュメント内で変数を展開してみましたが、こちらも取得することができませんでした。 ↓ $str=<<<eof {$response} eof; $pattern="/(?<=<status>).*?(?=</status>)/"; if(preg_match($pattern,$str,$match)){ print $match[0]; }
guest

0

全くどこから手をつけたらいいのか分からないってことなら、phpでxmlを利用する方法を調べると良いでしょう。https://www.php.net/manual/ja/refs.xml.php SimpleXML

既に途中までコード作っていてうまく行かない個所があるならそこを記載してくれた方が回答はしやすくなります。

やっぱ答え書いとくので、もし詰まったら下のコードと比較してみてください。

1 <?php 2 $xml=<<<EOT 3 <body cz-shortcut-listen="true"> 4 <resultset totalresultsavailable="1" totalresultsreturned="1" firstresultposition="1" ok="1" ng="0"> 5 <result> 6 <itemcode>ABC12345</itemcode> 7 <subcode></subcode> 8 <status>1</status> 9 <quantity>0</quantity> 10 <allowoverdraft>0</allowoverdraft> 11 <ispublished>1</ispublished> 12 <stockclose>0</stockclose> 13 <updatetime>2019-06-20T17:03:49+09:00</updatetime> 14 </result> 15 </resultset> 16 </body> 17 EOT; 18 19 $xmlObj = new SimpleXMLElement($xml); 20 print_r($xmlObj->resultset->result->status); 21 echo $xmlObj->resultset->result->status

投稿2019/06/20 09:32

編集2019/06/20 10:32
hentaiman

総合スコア6415

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

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

sawareco

2019/06/20 10:25

hentaimanさん アドバイスをいただき、ありがとうございます。XMLを扱うのが初めてで困っておりました。これを機に勉強していたいと思います。SimpleXMLですね、試してみたいと思います!
hentaiman

2019/06/20 10:41 編集

回答追記しといたので、もし行き詰まったら見てみてください。 質問文に書かれているxmlに合わせたコードなので、実際のレスポンス次第ではそのままのコードでは使えない可能性もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問