PHPでWebページの特定部を取得する方法と処理時間について

このQ&Aのポイント
  • PHPでWebページの特定部を取得する方法について、file_get_contentsとpreg_matchを使用していますが、上手くいきません。また、動的にURLを指定して取得する際に処理時間がかかる問題があります。
  • file_get_contentsを使用してURLを指定してWebページを取得し、preg_matchを使用して特定部を抽出していますが、正しく結果が得られません。また、URLを動的に指定する場合に、処理に時間がかかる問題があります。
  • 問題の一つは、file_get_contentsとpreg_matchの使い方です。正しいパターンを指定しているか確認し、結果を出力する方法を確認してください。もう一つの問題は、URLを動的に指定して取得する際の処理時間です。処理時間を短縮する方法を検討してください。
回答を見る
  • ベストアンサー

PHPでWebページの特定部を取得したいのですが、上手くいきません。

PHPでWebページの特定部を取得したいのですが、上手くいきません。 現在file_get_contentsを用いてURLを指定して取得し、preg_matchの引数にする方法で行っています。 また、preg_matchは以下のように用いています。 preg_match("/パターン(.*?)パターン/s", $html, $matches); print_rで$matchesを表示してみたところArray()のみ出力されます。 また、話が逸れて申し訳ないですが、上記とは別にfile_get_contentsを用いて動的にURLを指定して取得しているのですが、処理に時間がかかります。(約10秒) $wordをURLに組み込む変数として以下のように記述しています。 file_get_contents("http://…".$word."…(URLの続き)"); 以上の2点についてご教示願います。

  • Lulli
  • お礼率100% (5/5)
  • PHP
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

質問の意図が図りかねます・・・ どういうテキストから、どういうパターンで、どう抜きたいのか書かないと 「たぶんパターンが間違っている」としか回答しようがありません。 また、file_get_contentsで処理時間がかかる・・・というもの 環境によるものなのか、指定方法が悪いのか、こちらではわかりかねます。 とりあえずやるなら、バイナリセーフではないですがreadfileなどでざっと データを拾ってしまう手もあるので検討してみてはどうでしょうか?

Lulli
質問者

お礼

ご回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • PHPで<title>タグ取得の動作が非常に重い

    PHPで<title>タグ取得の動作が非常に重い $html = file_get_contents($url); if(preg_match( "/<title>(.*?)<\/title>/i", $html, $match)) { } 上記のような方法で一度に(1ページ内で)30サイトほどの<title>タグを取得すると、不可がかかり、表示までにかなり時間がかかってしまいます。 preg_match では重いのでしょうか。 それとも一度に30サイトはそもそも無理があるのでしょうか。。

    • ベストアンサー
    • PHP
  • サイト名を取得するPHP

    url.txtに http://test1.com http://test2.com http://test3.com : とあります。このURLのhtmlファイルから<title>サイト名</title>部分を抜き出し、 http://test1.com+サイト名1 http://test2.com+サイト名2 http://test3.com+サイト名3 : と表示したいです。 <?php /** * ページタイトルを取得する関数 */ function getPageTitle( $url ) { $html = file_get_contents($url); //(1) $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" ); //(2) if ( preg_match( "/<title>(.*?)<\/title>/i", $html, $matches) ) { //(3) return $matches[1]; } else { return false; } } $filename="url.txt"; $data=file_get_contents($filename); $array = split("\n",$data); foreach($array as $values){ echo $array."+".getPageTitle($array); } ?> ですがこのコードだと7行目あたりでエラーが出てしまいます。 どなたか解決策をご教示ください。どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP Webページのタイトルを取得したい

    検索したものに少し手を加えて、以下の関数を使って、URLを元にウェブページのタイトルを取得しています。  function getPageTitle( $url ) {   $html = file_get_contents($url);   $enc_format = "JIS, eucjp-win, sjis-win, UTF-8";   $html = mb_convert_encoding($html, "UTF-8", $enc_format);   preg_match("/<title>(.*)<\/title>/is", $html, $retArr);   return $retArr[1];  } しかし、ページによってはタイトルを取得するまでの時間が遅いです。おそらく、HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。今回はタイトルを取りたいだけなので、もっと早く処理ができてほしいです。何か方法はございますか?

    • ベストアンサー
    • PHP
  • phpでhtmlのタイトルを取得する方法について

    phpを使い、URLで指定されたサイトのタイトルを取得したいと考えています。 以下の通り実装してみたのですが、特定のサイトで取得したタイトルが文字化けしてしまいます。 mb_internal_encoding("UTF-8"); $html = file_get_contents($url); $convertedHtml = mb_convert_encoding($html, 'UTF-8', 'auto'); if (preg_match('/<title>(.*)<\/title>/i', $convertedHtml, $matches)) { return $matches[1]; } ※$urlにはタイトルを取得したいサイトのURLが入っています ※例をあげると、"http://rental.geo-online.co.jp" を$urlにセットした場合にタイトルが文字化けします 文字化けしてしまったサイトの文字コードは、x-sjisやEUC-JPでした。 この場合、$htmlから文字コードを指定しているタグをを取得すれば良いのか、 とも考えましたが、HTMLの知識に乏しくどのように正規表現を書いたら良いのかがわかりません。 ちなみにphpのバージョンは5.3.2です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでURLのソースの中から数字の文字列を検索したいのですが

    PHPでURLのソースの中から数字の文字列を検索したいのですが <?php $str = 85%80%78%77%70%60%; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> この記述で、文字列から80%のような 全角文字で%の前の文字だけを抜き出せました。 そこでURLからデーターを抜き出すべく ////////ソース////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> 下記のように記述しましたが <?php $html_data = file_get_contents("http://www.1234.com/1234.html"); if (preg_match("/<table\s.*>([\s\S]*)<\/table>/i",$contents,$matches)){ $contents = $matches[1]; } $str = $html_data; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> しかし、動作しません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • コードエラーが次のように出てしまいます。

    Notice: Undefined offset: 2 in C:\xampp\htdocs\news2.php on line 18 Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\news2.php on line 19 プログラミング超初心者です。var_dumpしてみてもarray[2]は存在していたのですが・・・。 なぜこのようなエラーが出るのか、またどのように解決すればよいのでしょうか。わかる方、教えてください。よろしくお願いします。 <?php $newstop="http://headlines.yahoo.co.jp/hl"; $html=file_get_contents($newstop); $patern1='/http.*c=bus/'; preg_match($patern1,$html,$matches1); //var_dump($matches1); $newstop2=($matches1[0]); $html2=file_get_contents($newstop2); //echo($html2); //ここから、記事全文を拾う $fullpattern='/http.*all/'; preg_match_all($fullpattern,$html2,$matches3); $fullurl=($matches3[2]); ※ここが18行目 $fulltext=file_get_contents($fullurl);       ※ここが19行目 echo ($fulltext); //var_dump($matches3); ?>

    • 締切済み
    • PHP
  • php4でxmlを取得してページに表示

    http://www.phppro.jp/school/mashup/vol3/2 を参考に以下コードを書いたのですが、記事を1件表示させるだけでなく別の記事も複数件表示させたい場合はどうすれば良いのでしょうか。 また、<dc:type>番付</dc:type>のものだけを抜き出す方法も教えていただけると嬉しいです。宜しくお願い致します。 <?php function news(){ //XMLデータ取得用ベースURL $req = "http://polls.dailynews.yahoo.co.jp/rss.xml"; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<item>.*?<title>(.*?)</title>.*?<link>(.*?)</link>.*?<description>(.*?)</description>.*?<dc:subject>.*?</dc:subject>.*?<dc:type>(.*?)</dc:type>.*?</item>@s', $buf, $match, PREG_SET_ORDER); $ret .= "<h1><a href=\"".$match[0][2]."\">".$match[0][1]."</a></h1>"; $ret .= "<div>".$match[0][3]."【".$match[0][4]."】</div>"; return $ret; } echo news(); ?>

    • ベストアンサー
    • PHP
  • 以下のコードでエラーが出てしまいます。

    Notice: Undefined offset: 2 in C:\xampp\htdocs\news2.php on line 18 Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\news2.php on line 19 プログラミング超初心者です。var_dumpしてみてもarray[2]は存在していたのですが・・・。 なぜこのようなエラーが出るのか、またどのように解決すればよいのでしょうか。わかる方、教えてください。よろしくお願いします。 <?php $newstop="http://headlines.yahoo.co.jp/hl"; $html=file_get_contents($newstop); $patern1='/http.*c=bus/'; preg_match($patern1,$html,$matches1); //var_dump($matches1); $newstop2=($matches1[0]); $html2=file_get_contents($newstop2); //echo($html2); //!ここまでで経済面のトップページはとってこれた //ここから、記事全文を拾う $fullpattern='/http.*all/'; preg_match_all($fullpattern,$html2,$matches3); $fullurl=($matches3[2]); ※ここが18行目 $fulltext=file_get_contents($fullurl);       ※ここが19行目 echo ($fulltext); //var_dump($matches3); ?>

    • 締切済み
    • PHP
  • スクリプトの中から使用されている変数と関数をリストする

    phpで書かれたスクリプトファイルの中から使用されている関数と変数をリストアップさせるようなことをしたいのですが、preg_matchを使うのが妥当でしょうか?また、正規表記はどんな感じがベストでしょうか?自分で試してみてもまったくへたくそでして... トホホ ぜひ皆さんの技量を拝見させてください ^^。 <?php $data = file_get_contents('~.php'); $functions = '/\s*\(*/i'; preg_match($functions, $data, $matches); print_r($matches); echo "<br>"; $variables = '/^\$[.+]/i'; preg_match($variables, $data, $matches2); print_r($matches2); echo "<br><br>"; echo $data; ?>

    • ベストアンサー
    • PHP
  • マッチ情報を取得

    $yahoo = file_get_contents(http://www.yahoo.co.jp/) で取得したソース情報の中から特定の情報だけを抜き取りたいのですが・・・。 正規表現 preg_match()などを使って欲しい情報があれば、特定の範囲を抜き取りするのかな?と思うのですが・・・。 いまいちやり方がわかっていません。 アドバイスお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう