プロが教える店舗&オフィスのセキュリティ対策術

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行目あたりでエラーが出てしまいます。
どなたか解決策をご教示ください。どうかよろしくお願いします。

A 回答 (3件)

>mb_internal_encoding()



mb_detect_encoding()じゃなくて?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/04 15:22

エラーメッセージは次のようなものではないでしょうか?



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.fore …


おまけ:

url.txt の改行コードが CRLF (\r\n) の場合、
\r が残って動作がおかしくなるかもしれません。
その場合は trim 関数等で取り除くとよいと思います。

foreach($array as $values){
$url = trim($values);
echo $url."+".getPageTitle($url);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

【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!
というエラーが出てきます。

このエラーの解決方法を教えてください。
どうかよろしくお願いします。

お礼日時:2011/09/05 05:40

警告が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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
教えていただいたところを訂正し、関数の文字化けを参考にしながら直したらここまでできました。
<?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が取得されないのは何故なのでしょうか。
よろしくお願いします。

お礼日時:2011/09/05 17:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!