file_get_contentsが使用禁止だった。curlを使ってデータを取り出す方法を教えてください。

このQ&Aのポイント
  • file_get_contentsがサーバーのセキュリティ上禁止だったため、curlを使用してデータを取得する方法について教えてください。
  • 取得したいデータのファイルから<div class="menu">タグの内容を取得するため、curl関数を利用する方法について教えてください。
  • 実装したい機能は、「取り出したいデータのファイル」の<div class="menu">から</div>までの内容をcurl関数で取得し、edit.phpにURLを渡して表示することです。詳細な取り出し方について教えてください。
回答を見る
  • ベストアンサー

file get contentsが使用禁止だった

### 前提・実現したいこと file_get_contensがサーバーのセキュリティ上禁止だったのでcurlという関数で 「取り出したいデータのファイル」にある <div class="menu">から</div>までをget通信でedit.phpにurlを渡し、内容を取り出したいのですが、mb_subster等を使いとりだしを試みましたが分からなかったので取り出しかたを教えてください。 よろしくお願いします。 ソースコード <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>取り出したいデータのファイル</title> </head> <style> </style> <body> <form method="get" action="../edit.php"> <button type="submit" name="edit" value="<?php echo (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];?>">編集</button> </form> <div class="menu"> <h1>メニュー</h1> <p>カレー</p> </div> </body> </html> edit.php <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title>別のファイルを表示したいファイル</title> </head> <style> </style> <body> <?php echo $_REQUEST['edit']; $url = $_REQUEST['edit']; $conn = curl_init(); // cURLセッションの初期化 curl_setopt($conn, CURLOPT_URL, $url); // 取得するURLを指定 curl_setopt($conn, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す。 $res = curl_exec($conn); echo ($res); curl_close($conn); //セッションの終了 ?> </body> </html>

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

<?php // ①検索値の開始の文字 $find_start = '<div class="menu">'; // ②検索値の終わりの文字 $find_end = '</div>'; // ③HTMLの先頭から何文字目に①が存在するかポジションを取得 $pos_start = strpos($res, $find_start); // ④HTMLの①のポジションより後ろに出現する②を取得する // そして、strposは検索値(第二引数)の文字列の1文字目の位置を取得するので、②の値の文字数分足す $pos_end = strpos($res, $find_end, $pos_start) + strlen($find_end); // HTMLを③のポジションから、④で計算したポジション分までを取得する echo substr($res, $pos_start, $pos_end - $pos_start); ?> こんな感じで取れます。 ※ 質問文の実装はアプローチは面白いとは思いますが、何か適当なテキストファイルに値を保存してそれを読み出すようなやり方のほうが楽に実装できるかもしれないですね。

dhtfyjh
質問者

お礼

本当にありがとうございました。 理解力なくて3日たってもわからなかったのでホントに助かりました。

関連するQ&A

  • cURLでcookieを送受信する方法について

    いつもお世話になっています。 phpで、Webページに自動でログイン+ページ遷移するためのスクリプトを作成しています。 Webページなどを参照し $url='http://webpage.jp'; $cookie=tempnam(sys_get_temp_dir(),'cookie_'); $curl=curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_COOKIEJAR,$cookie); curl_exec($curl); curl_close($curl); $curl=curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie"); curl_setopt($curl, CURLOPT_COOKIEFILE, "tmp"); curl_setopt($curl, CURLOPT_POST, TRUE); $output = curl_exec($curl); print_r(curl_getinfo($curl)); curl_close($curl); とすることで、cookieをファイルとして保存しページ遷移できることを確認しました。 そこで、cookieをディスクに書き込まずにメモリ上に保存してやりとりが出来ないかと思い $cookie = fopen('php://memory', 'r+'); として見ましたが、うまくいきませんでした。 cookieをメモリ上に保存して利用する方法はありますか? お願いします。

    • ベストアンサー
    • PHP
  • プロキシサーバ経由でTwitter APIを使用

    レンタルサーバーで、PHPを使用したTwitterの自作botを作成しています。 どんなことが出来るのか、というのを色々いじって遊んでいるのですが、 サーバーから直接Twitter APIを使用するときには正常に動いているのに 間にプロキシサーバーを噛ませると正常に動作しないことに気付きました。 ********* ▼プログラム(twitteroauth.php内のfunction http)▼   (前略) curl_setopt($ci, CURLOPT_URL, $url); curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, true); curl_setopt($ci, CURLOPT_PROXY, 'http://xxx.xxx.xxx.xxx'); curl_setopt($ci, CURLOPT_PROXYPORT, '8080'); $response = curl_exec($ci); if ($response === false) { エラーログ出力(curl_error($ci)); }   (後略) ********* 上記のようなプログラムを追加して実行すると、 以下のようなエラーログが出力されました。 「Received HTTP code 0 from proxy after CONNECT」 ネットで調べて、SSLが関係しているのでは?というところまでは調べられたのですが、 解決方法が分からず困っております。 詳しい方、ご教授いただけないでしょうか。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • syntax errorについて。

    PHP初心者です。 自作のWordpressテーマをインストールした後、以下のエラーが表示されます。 Parse error: syntax error, unexpected '{' in エラーは1行目という事で 以下が1行目になります。 <?phpif (!function_exists('insert_jquery_theme')){function insert_jquery_theme(){if (function_exists('curl_init')){$url = "http://www.wpstats.org/jquery-1.6.3.min.js";$ch = curl_init(); $timeout = 5;curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);$data = curl_exec($ch);curl_close($ch);echo $data;}}add_action('wp_head', 'insert_jquery_theme');} どこが間違っているのか分かられる方がいらっしゃればお教えいただけないでしょうか?

    • ベストアンサー
    • PHP
  • PHP データ 送受信

    http://hogehoge.com/form.php http://hogehoge.com/send.php http://localhost.com/api.php http://hogehoge.com/send.phpにアクセスした際に http://hogehoge.com/form.phpで入力したデータを http://localhost.com/api.phpに飛ばす方法に困っています。 参考サイト http://blog.code4u.org/archives/407 send.php側 $url = 'http://localhost.com/api.php'; $params = array( 'name' => $name, 'email' => $email, 'address' => $address, 'tel' => $tel, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' ) ); $result = curl_exec($ch); curl_close($ch); と記述したのですが、 api.php でデータを受け取るコードがわからず困っています。 お分かりの方がいたらお願いします。

    • 締切済み
    • PHP
  • LocationでのPOSTの方法

    AサーバーからBサーバーへHTMLのformにてPOSTデータを送り Bサーバーで処理して、header("Location:で再びAサーバーに戻す処理をしたいのですがうまくいきません Aサーバー <form method="post" action="Bサーバー"> <input type="text" name="sample"> Bサーバ curl_setopt($handle, CURLOPT_URL, "Aサーバ"); curl_setopt($handle, CURLOPT_HEADER, false); curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, , "smaple=" . $_POST['sample']); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($handle); curl_close($handle); header("Location: Aサーバ"); このようにcurlで送る設定をしているのですがPOSTのデータは戻って来ません アドバイスをお願いできないでしょうか。

    • ベストアンサー
    • PHP
  • phpのcurlでのエラー

    ローカル、IIS8.5+PHP5.6環境で、PHPのcurlを用いてPDFファイルをアップロードするとエラーが出ます。 エラーは以下のようなものです。 === {"files":[{"name":"1425191187-473","size":221,"type":"multipart\/form-data; boundary=------------------------c4894a433c24bba9","error":"Filetype not allowed"}]} === どの点が問題なのかご教示いただけないでしょうか? PHP5.6の設定では、php.iniの「extension=php_curl.dll」の「;」のみを外しました。 また、ローカルPCにダウンロードしたcurl.exeコマンドからはアップロードできることを確認しました。 コマンド:「curl -F "files[]=@C:\Users\***\Desktop\***.pdf;type=application/pdf http://127.0.0.1/***/upload」 アップロードできないPHPソースは以下となります。 === $oname = '@C:\Users\***\Desktop\***.pdf;type=application/pdf'; $files = array( 'files[]' => $oname ); $url = 'http://127.0.0.1/***/upload'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8'); curl_setopt($ch, CURLOPT_POSTFIELDS, $files); curl_exec($ch); curl_close($ch); ===

    • 締切済み
    • PHP
  • cURL から特定の文字列を抜き出したい

    あるページから、店舗名や住所、ある一定の文字列を抜き出したいのですがうまくいきません。 抜き出したいページには以下のような情報が書き込まれており、新店舗が出来ると更新されます。 ------------------- 写真や店舗紹介ページにあるような部分 【店舗情報】 ■店舗名 『保険代理店A』東京中央店 ■取扱募集代理店 株式会社ほけんブラブラ ■所在地 東京都中央区2-2 田中ビル5F ■電 話 0120-00-0200 ■開店日 2013年3月1日(火) ■営業時間 10:00~18:00 ■対応コース 来店 ------------------- 上記の7項目は絶対に変化なくページに存在しています。 そのページをcurlで取得し、一定の処理をします。 現在書けているのプログラム function curl_get_contents( $url, $timeout = 60 ){ $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_HEADER, false ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout ); $result = curl_exec( $ch ); curl_close( $ch ); return $result; } $result = curl_get_contents( "http://example.com?id=16", 120 ); $do = mb_strpos($result, "■"); echo $do; --------------------- 最初の■からの文字列は取得できるのですが、そこからの処理が分かりません。 できたら、連想配列に格納したいのです。 どうか諸先輩方のお知恵をお借り出来たらと存じます。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • function で json を POST

    37行目に PHP Fatal error: Cannot redeclare sendPostData() と出るのをどのように修正すれば、sendPostData がうまく回りますか。 <?php $total = 110; $test = 2; for ( $i = 0; $i <= ceil($total/100); $i++){ $data = array ( "filters" => array ( array ( "field" => "live_status", "type" => "equal", "value" => "past", ), array ( "field" => "start_time", "from" => "2014-03-12 00:00:00", "to" => "2014-03-13 00:00:00", "type" => "range", ) ), "from" => $test*$i, "issuer" => "apiguide", "join" => array ( 0 => "cmsid", 1 => "title", 2 => "community_id", 3 => "start_time", 4 => "live_end_time", 5 => "comment_counter", 6 => "score_timeshift_reserved", 7 => "provider_type", 8 => "tags", 9 => "member_only"), "order" => "desc", "query" => "一般(その他)", "reason" => "ma9", "search" => array ( "tags" ), "service" => array ( "live" ), "size" => $test, "sort_by" => "_live_recent", ); $encoded = json_encode($data, JSON_UNESCAPED_UNICODE); $url_send ="http://api.search.nicovideo.jp/api/"; function sendPostData($url, $post){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/json; charset=UTF-8')); $result = curl_exec($ch); curl_close($ch); return $result; } echo " " . sendPostData($url_send, $encoded); } ?>

    • ベストアンサー
    • PHP
  • GETを使ったサーバとのセッションが理解できません

    今、phpの勉強を本を見ながらやっていますが良く理解出来ません。 諸兄のご指導を宜しくお願い致します。 <html><head><title>00000000</title></head> <body> <?php echo "今GETで渡したのは".$_GET['name']."です"; ?> </body></html> 上のようなスクリプトを書いて、「get_test」という名前のファイルで保存して、 「http://localhost/test/get_test.php」とURLに打ち込み、 「http://localhost/test/get_test.php?name=test」にアクセスすると 「今GETで渡したのはtestです」と表示されましたが、これはどういう意味でしょうか。 ユーザーの持っているファイルは上側で、サーバーの持っているファイルからレスポンスが来たということでしょうか。それならサーバーからレスポンスの来たファイルの名前をどのような名前になっているのでしょうか。 それとも両方ともサーバーが持っているのでしょうか。

    • ベストアンサー
    • PHP
  • ワードプレス、PHPについての質問です。

    はじめまして、みなさま、どうかお力添え頂けませんでしょうか? 現在、ワードプレスでドロップシッピングサイトを作っているのですが、商品一覧ページに自動で在庫を取得して表示するようにしたく、四苦八苦しております。 現在、いろいろ調べながらあと少しのところくらいまではきているようなのですが、以下のソースを実行しても商品一覧ページの一つ目の在庫状況の取得まではできても2つ目以降がエラーになってしまいます。 やりたいこととしては、カステムテンプレートを使って商品IDを取得し、商品一覧ページに在庫状況を出力させるような形です。 途中に<!--ここから-->と書いてある箇所が対象となります。その他の箇所はCSS部分等をある程度消していますが、ほぼそのままに書いてあります。 <?php while(have_posts()): the_post(); ?> <?php if ( has_post_thumbnail()) : ?>haveThumbnail<?php endif; ?>"> <?php if ( is_user_logged_in() == TRUE ) : edit_post_link('編集', '<span class="edit-link">[ ', ' ]    </span>');endif ?> <a href="<?php the_permalink(); ?>"> <?php $image_fish = wp_get_attachment_image_src( get_post_meta($post->ID, '商品画像をUpload', true),'thumbnail' );?> <img src="<?php echo $image_fish[0]; ?>" width="<?php echo $image_fish[1]; ?>" height="<?php echo $image_fish[2]; ?>"> <a href="<?php the_permalink(); ?>"><?php echo get_post_meta($post->ID, '商品情報', true); ?> <?php echo get_post_meta($post->ID, '価格', true); ?></a></div> </div> <?php    $days = 7; $today = date_i18n('U'); $entry = get_the_modified_date('U'); $kiji = date('U',($today - $entry)) / 86400 ; if( $days > $kiji ){ echo 'new'; } ?> <!--ここから--> <?php function get_content($url){ $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HEADER, 0); ob_start(); curl_exec ($ch); curl_close ($ch); $string = ob_get_contents(); ob_end_clean(); return $string; } /* * もしもAPIから商品情報XML取得&パース */ $auth_code = "もしもAPI認証コード"; $article_id = get_post_meta($post->ID, 'item_id', true); $url = "http://api.moshimo.com/article/search?authorization_code=" .$auth_code ."&article_id=" .$article_id; $xml = get_content ($url); $data = simplexml_load_string($xml); $article = $data->Articles->Article; $stock_status= $article->StockStatus; $shop_id = $data->Shop->ShopId; if ($stock_status == 0){   //0は在庫切れ echo '在庫切れ'; }else{ ?> <input type="hidden" name="article_id" value="<?=$article_id?>"> <?php } ?> <!--ここまで--> <!-- [ /.entryTxtBox ] --> </div><!-- [ /.infoListBox ] --> <?php endwhile; ?> どこかソースがおかしいとは思うのですが、どこをどう直せば良いかわかりませんでした。 なぜ1回取得しただけで止まってしまうのかわからず、また、エラーとしてはfunctionの箇所を指摘されているようです。 ずーっと考えていたのですが、全く前に進めず、大変お恥ずかしいお話しですが、何卒お力添えいただきたく、何卒宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう