PHPでサイト名を取得する方法

このQ&Aのポイント
  • PHPで指定したURLのhtmlファイルから<title>タグ内のサイト名を抜き出す方法について説明します。
  • 具体的なコードを紹介しますが、エラーが発生する場合に注意点も説明します。
  • エラーの原因と解決策についても解説し、問題を解決する方法を提供します。
回答を見る
  • ベストアンサー

サイト名を取得する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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • tomaju
  • ベストアンサー率76% (84/110)
回答No.3

警告が2種類出ています。 > Warning: mb_detect_encoding() expects at least 1 parameter, 0 given mb_detect_encoding() は最低でも1つはパラメータが必要だけど、 ひとつも与えられてないよ、と警告されています。 $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" ); //(2) ここで、mb_detect_encoding() を mb_internal_encoding() に戻してみると どうでしょうか。 > Warning: file_get_contents(http://blog.livedoor.jp/dqnplus/ ) [function.file-get-contents]: > failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in こちらは、URLの末尾に \r が付いているのではないかと思います。 foreach($array as $values){ $url = trim($values); echo $values."+".getPageTitle($values); echo "\n"; } $url = trim($values); で、$values を trim にかけた結果が $url に入っていますが、 $url が使われていません。 $values ではなく $url を getPageTitle に渡してください。 foreach($array as $values){ $url = trim($values); echo $url."+".getPageTitle($url); echo "\n"; } あるいは、$values がよければ、 trim の結果を $values に代入してください。 foreach($array as $values){ $values = trim($values); echo $values."+".getPageTitle($values); echo "\n"; } http://php.net/manual/ja/function.trim.php

spinia0120
質問者

お礼

ご回答ありがとうございます。 教えていただいたところを訂正し、関数の文字化けを参考にしながら直したらここまでできました。 <?php /** * ページタイトルを取得する関数 */ function getPageTitle($url){ $html = file_get_contents($url); $enc_format = "JIS, eucjp-win, sjis-win, UTF-8"; $enc_html = mb_convert_encoding($html, "UTF-8", $enc_format); if(preg_match( "/<title>(.*?)<\/title>/is", $enc_html, $matches)){ return $matches[1]; } else { return false; } } $filename="url.txt"; $data=file_get_contents($filename); $array = split("\n",$data); foreach($array as $values){ $url = trim($values); echo $url."+".getPageTitle($url); echo "\n"; } ?> --- http://wired.jp/+ WIRED.jp 世界最強の「テクノ」ジャーナリズム http://workingnews.blog117.fc2.com/+ http://blog.livedoor.jp/dqnplus/+痛いニュース(ノ∀`) - ライブドアブログ http://yahoo.com/+Yahoo! --- echo "\n";を指定しているにもかかわらず各行が改行されないのと、fc2.comのtitleが取得されないのは何故なのでしょうか。 よろしくお願いします。

その他の回答 (2)

  • tomaju
  • ベストアンサー率76% (84/110)
回答No.2

エラーメッセージは次のようなものではないでしょうか? PHP Warning: file_get_contents() expects parameter 1 to be string, array given in ファイル名 on line 行番号 foreach のループ内で getPageTitle に $array を渡しています。 foreach($array as $values){ echo $array."+".getPageTitle($array); } この foreach ループでは、配列 $array から要素が次々取り出されて $values に入りますので、 質問者さんがやりたいことは下記のようになるかと思います。 foreach($array as $values){ echo $values."+".getPageTitle($values); } http://php.net/manual/ja/control-structures.foreach.php おまけ: url.txt の改行コードが CRLF (\r\n) の場合、 \r が残って動作がおかしくなるかもしれません。 その場合は trim 関数等で取り除くとよいと思います。 foreach($array as $values){ $url = trim($values); echo $url."+".getPageTitle($url); }

spinia0120
質問者

お礼

ありがとうございます。 【gettitle.php】 --- <?php /** * ページタイトルを取得する関数 */ function getPageTitle( $url ) { $html = file_get_contents($url); //(1) $html = mb_convert_encoding($html, mb_detect_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){ $url = trim($values); echo $values."+".getPageTitle($values); echo "\n"; } ?> --- 【url.txt】 --- http://wired.jp/ http://workingnews.blog117.fc2.com/ http://blog.livedoor.jp/dqnplus/ http://yahoo.com/ --- これで実行してみましたが、 Warning: mb_detect_encoding() expects at least 1 parameter, 0 given in C:\xampplite\htdocs\geturltitle.php on line 7 http://wired.jp/ +HELLO, WORLD « WIRED.jp ????????????????? Warning: mb_detect_encoding() expects at least 1 parameter, 0 given in C:\xampplite\htdocs\geturltitle.php on line 7 http://workingnews.blog117.fc2.com/ +404 Error - FC2??? Warning: file_get_contents(http://blog.livedoor.jp/dqnplus/ ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampplite\htdocs\geturltitle.php on line 6 Warning: mb_detect_encoding() expects at least 1 parameter, 0 given in C:\xampplite\htdocs\geturltitle.php on line 7 http://blog.livedoor.jp/dqnplus/ + Warning: mb_detect_encoding() expects at least 1 parameter, 0 given in C:\xampplite\htdocs\geturltitle.php on line 7 http://yahoo.com/+Yahoo! というエラーが出てきます。 このエラーの解決方法を教えてください。 どうかよろしくお願いします。

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

>mb_internal_encoding() mb_detect_encoding()じゃなくて?

spinia0120
質問者

お礼

ご回答ありがとうございます。 その部分を書き換えましたが、やはりエラーが出ます。

関連する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で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
  • php表に変換

    php表に変換についての質問 メモ帳に時計、300、50、布団、200、30、本、50、40 などと打ちむと商品名、単価、数量、小計、合計を表にして表してくれるphpを作りたいのですが メモ帳を読み込むところまでできたのですがそこからなかなか進みません どなたかご教授ください <? $filename ="test.txt"; if(is_readable($filename) { $contents = file_get_contents($filename); print$contents; }else{ print$filename."は読み込めません。 "; } ?>

    • ベストアンサー
    • PHP
  • HTMLをPHPでJSONにして返すには

    jqueryでurlをPHPに送って、そのurlのhtmlファイルから、titleタグやh1タグの内容を抽出し、連想配列に格納。そして、その連想配列をJSON形式にしてjqueryに返し、htmlにレンダリングしたいのですが上手くいきません。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function site_check(){ var url = $("#url").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURIComponent(url) ,function(res){ $("#title").html(res.title); $("#h1").html(res.h1); }); } </script> </head> <body> <div class="form"> URL <input type="text" id="url" value="" style="width:300px;" onfocus="this.select()" onkeypress="if(event.keyCode==13) site_check()" /> <button onclick="site_check()" />チェック</button> </div> title:<span id="title"></span></br> h1:<span id="h1"></span> </body> test.php↓ <?php $html=mb_convert_encoding(file_get_contents($_GET['url']), 'UTF-8', 'auto'); $array = array(); $pattern = "/(?<=<title>).+?(?=<\/title>)/mis"; preg_match($pattern,$html,$array['title']); $pattern = "/(?<=<h1>).+?(?=<\/h1>)/mis"; preg_match($pattern,$html,$array['h1']); header("Content-Type: application/json; charset=UTF-8"); echo json_encode($array); ?> このコードだと、test.phpからは、[object Object]と、レスポンスが返ってきてしまいます。

    • ベストアンサー
    • 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で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
  • 【Flash】PHPを使って変数を読み出し

    【count.php】にこのようなスクリプト記述。 動作はここで確認できます。 【ttp://flash-moe.yi.org/count/count.php】 <?PHP ini_set('display_errors', '1'); $file = file_get_contents ("./count.txt"); $file++; file_put_contents ("./count.txt", $file); $file = mb_convert_encoding($file, "UTF-7", "EUC-JP"); echo $file; ?> それを【LoadVars】を使って値を取得させるには どうしたらいいのか?教えてくださいm(_"_)m

    • ベストアンサー
    • Flash
  • PHPの正規表現でHTMLタグの内容を抽出したい

    jqueryでPHPにurlを渡して、そのurlの中のtitleタグの内容を抽出したいと思ってます。が、うまく行きません。 ●jquery↓ <script type="text/javascript"> function site_check(){ var url = $("#url0").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURI(url) ,function(res){ $("#title").html(res.title); }); } </script> ●test.php↓ $html=file_get_contents($_GET["url"]); preg_match_all("/<title>(.*?)<\/title>/i",$html,$html_title); header('Content-type: application/json'); echo json_encode($html_title); このコードではなにもレスポンスが帰って来ません。 もし足りない情報がありましたらご指摘ください。

    • ベストアンサー
    • 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

専門家に質問してみよう