PHP Webページのタイトルを取得する方法について

このQ&Aのポイント
  • PHPを使用してウェブページのタイトルを取得する方法について説明します。
  • file_get_contents関数と正規表現を使用して、URLからHTMLを読み取り、タイトルを抽出することができます。
  • タイトルを取得するまでの処理時間を短縮するために、HTMLの一部だけを読み込む方法もあります。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
noname#244856
noname#244856
回答No.2

まずは $html = file_get_contents($url); を $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); に変えるところからどうぞ。これだけでかなり速くなると思います。これで速度が足りなければ fopen で1行ずつ読み込んでいくことも検討しましょう。なお、提示された関数中の文字コードの羅列順序が不適切です(私もググって出てきたってことで以前はこれ使ってましたが、誤りです)。以下に正しい順番に直したサンプルを掲載しておきます。 function getPageTitle($url) {   static $regex = '@<title>([^<]++)</title>@i';   static $order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win';   static $ch;   if (!$ch) {     $ch = curl_init();     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   }   curl_setopt($ch, CURLOPT_URL, $url);   $html = mb_convert_encoding(curl_exec($ch), 'UTF-8', $order);   return preg_match($regex, $html, $m) ? $m[1] : ''; } また、そもそも遅い原因が「この関数の実行を繰り返している」ということであれば、今はオーダー表現で表せば O(n) 時間かかっていることになりますが、回線が許す限り O(1) の実行時間にする方法があります。これに該当する場合はその点の補足をお願いします。

newtgecko
質問者

お礼

何度も、試したところ、実用的な早さなので、使わせていただきます。ありがとうございました

newtgecko
質問者

補足

ご回答有難うございます! 一行ずつ読み取る考えは思い浮かびませんでした。<title></title>が一行に収まってることが前提じゃないと処理が少し複雑なるかも知れませんが。 適切なコードまで、載せていただき感謝しています。これから実行してみます!

その他の回答 (1)

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

>HTMLをすべて読み取るまで、終了しないため、遅くなるのだと思います。 それはhttpの仕組み上そういうものでは? 複数ページクロールするのならwgetあたりで非同期にバックグラウンド処理をさせるとか タイトルを持ってくる部分をタイトルを抜くだけのPHPをajaxで走らせれば 速いところから順次うまっていくので、感覚的に速いと思えるようになるかもしれません。 また更新時間などを保存しておき、2回目以降の検索時にはヘッダ情報の日付けを 見るなりして、変更がなけば前回のデータを利用するなど それなりの処理をすればある程度実用レベルのスピードになるのでは?

newtgecko
質問者

補足

そういった方法しかないのですか。今のところURLを先に表示しておいて、決まったら、URLをタイトルに書き直すようにはしてみましたが。 ブラウザだと、ページが完全に読み終わる前に、タイトルが表示されるので、何か方法があるかと思いました。

関連するQ&A

  • 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+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • 文字コード変換

    PHP4.4を使っています。 プログラム中の文字列変数値「標の鷹」から、 http://xxx.cgi?prm=%95W%82%CC%91%E9 という文字列(リンク)を生成したいのですが、 http://xxx.cgi?prm=�W�̑� のようになってしまいます。 ソースは以下の通りです。 $img_url = "http://xxx.cgi?prm=".$row[0]; mb_detect_order("ASCII, JIS, UTF-8, eucJP-win, EUC-JP, SJIS-win, SJIS"); $enc = mb_detect_encoding($row[0]); // この時点で$row[0]=「標の鷹」 if ( ($enc != "ASCII") && ($enc != "JIS") && ($enc != "UTF-8") && ($enc != "eucJP-win") && ($enc != "EUC-JP") && ($enc != "SJIS-win") && ($enc != "SJIS") ) {   echo "未知の文字コードが入力されました。<br />\n";   exit; } $url = mb_convert_encoding($url,"SJIS",$enc); echo "url = ".$img_url."; ※ちなみに、このコードが書いてあるphpファイルはutf8です。

    • ベストアンサー
    • PHP
  • 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で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点についてご教示願います。

    • ベストアンサー
    • PHP
  • UTF-8サイトを取得しSJISに

    以下のPHPで指定のサイトを取得すると文字化けしてしまいます。 何処が悪いのか分かる方、ご指導お願い致します。 <?php $str = file_get_contents('http://esthe-cinderellaesthe.on.omisenomikata.jp/diary'); mb_convert_encoding($str,"SJIS","UTF-8"); if (preg_match('!<div id="content">(.*?)<div class="pr">!s', $str, $res)){ print $res[1]; } ?>

    • ベストアンサー
    • 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の mb_detect_encoding 関数を使っているのですが、 文字エンコーディングの検出が間違っていないかを検証する為に、 以下のように、検出された文字コードに戻し、元の文字列と一致するかで、 検出された文字エンコーディングが正しかったか確認しています。 $str = file_get_contents ( $url ); $moji_code = mb_detect_encoding ( $str , "ASCII,JIS,UTF-8,eucJP-win,SJIS-win" ); $str_after = mb_convert_encoding ( $str , 'UTF-8' , $moji_code ); if ( $str !== mb_convert_encoding ( $str_after , $moji_code , 'UTF-8' ) ) {     //文字化けしている可能性あり } これで、完璧でしょうか?

    • ベストアンサー
    • PHP
  • Webプログラミングについて

    Webプログラミング初心者です. PHP 文字化けについて質問です データベースをつかった簡単なリンク(検索)を作ろうとおもったのですが, function cnv_sqlstr($string){ $det_enc=mb_detect_encoding($string,"SJIS,utf8,EUC-JP"); if($det_enc and $det_enc != ENCDB){ $string=mb_convert_encoding($string,ENCDB,$det_enc); } $string=addslashes($string); return $string; } function cnv_dispstr($string){ $det_enc=mb_detect_encoding($string,"SJIS,utf8,EUC-JP"); if($det_enc and $det_enc != ENCDISP){ return mb_convert_encoding($string,ENCDISP,$det_enc); } else { return $string; } } このような感じで文字の変換を行ったつもりなのですが,日本語の文字が化けてしまいます...>< ENCDB,ENCDISPは共に定数化してあり,utf8としてあります. データベースの方は(Xamppを使用)照合順序の部分はutf8_unicode_ciとなっています. どうして文字化けが直らないんでしょうか??教えて下さい><

    • ベストアンサー
    • PHP
  • 動的なPHPを静的なhtmlページに変換したい

    動的なPHPページ(RSS)を静的なhtmlのページとして、変換したいのですが、どのようにしたら良いでしょうか? 書いたPHPは下記のようなモノです。 <?php error_reporting(E_ERROR); require_once 'rss_fetch.inc'; define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); $url = 'http://b.hatena.ne.jp/entrylist?mode=rss&url=http%3A%2F%2Fwww.lucky-bag.com'; $rss = fetch_rss($url); $title = $rss->channel['title']; $title = mb_convert_encoding($title, "EUC-JP", "auto"); echo "<h3>$title</h3>\n"; echo "<dl>\n"; foreach ($rss->items as $item ) { $title = htmlspecialchars($item['title']); $title = mb_convert_encoding($title, "EUC-JP", "auto"); $description = htmlspecialchars($item['description']); $url = htmlspecialchars($item['link']); echo "<dt><a href=\"$url\">$title</a></dt>\n"; $description = mb_convert_encoding($description, "EUC-JP", "auto"); echo "<dd>$description</dd>\n"; } echo "</dl>\n"; ?> どうぞよろしくお願いいたします。

    • 締切済み
    • PHP