PHPの質問です

a.phpを作ったのですが
diff.txtに思った通りのテキストを出力せずnew.txtとおなじものを抽出します
どこを改良すれば diff.txtに差分テキストが表示されるようになるのでしょうか?
教えてください

a.php
**************
<?php
mb_language("Japanese");
mb_internal_encoding("utf-8");
$str = file_get_contents("http://headlines.yahoo.co.jp/hl");
$str = mb_convert_encoding($str, "utf-8", "auto");
preg_match("/<ul id=\"gnSec\">(.+?)<\/ul>/ismu", $str, $arr);
$patterns = array();
$patterns[0] = "/^<meta.*\n/mu";
$replacements = array();
$replacements[0] = '';
$sResult = preg_replace($patterns, $replacements, $arr[1]);
file_put_contents("new.txt", $sResult);
$file_new = file("new.txt", FILE_IGNORE_NEW_LINES);
$file_old = file("old.txt", FILE_IGNORE_NEW_LINES);
$result = array_diff($file_new , $file_old);
file_put_contents("diff.txt", join("\n", $result));
?>
**************

old.txt
**************
<li><a href="http://headlines.yahoo.co.jp/hl?c=flash">速報</a></li>
<li><a href="http://headlines.yahoo.co.jp/hl?c=dom">国内</a></li>
**************

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/04/12 02:42:18
  • 終了:2013/04/13 22:24:31

ベストアンサー

id:tezcello No.2

tezcello回答回数457ベストアンサー獲得回数682013/04/12 12:15:11

ポイント150pt

他人の作ったデータをスクレイピングするには、(現状は)実際にどんなデータが取得できているのかを把握するのが最初です。

質問者さんの取得したいデータは、本当に「http://headlines.yahoo.co.jp/hl」のものでしょうか?
だとしたら、id="gnSec" の ul には meta は存在せず、単純な li が並んでいるので $arr[1] から $sResult を作っている preg_replace() は不要ですね。

そして、実際に取得できたデータ( new.txt へ保存したもの)をエディタで確認されていますか?
そして、 old.txt に予め書いておいたデータ(ですよね?)と同じ書式になっていますか?
ご確認頂ければすぐに解りますが、各行の先頭にスペースが8個存在します。
これを除去するのはいろいろ方法がありますけど、せっかく複数の置換が出来るように用意しているので、
$patterns[1] = '/\s*\n\s*/';
$replacements[1] = "\n";
とでもするのはいかがでしょうか。
__改行文字の前後に複数の空白系文字がある場合は一つの改行だけにする

データの先頭に改行が入っているのが気持ち悪いので、同様に正規表現を追加して削除するか、$arr[1] か $sResult のどちらかを trim() または ltrim() で削除したらどうでしょうか?

$sResult の生成時に、不要な部分を削除するのではなく、必要な部分を取り出す方が良かったのかもしれません。


(以下蛇足)
先の質問 http://q.hatena.ne.jp/1365680308

http://q.hatena.ne.jp/1365606294 と②http://q.hatena.ne.jp/1365546701 の質問の続きです
...
①だけのphp ②だけのphp を実行した場合はうまく動作ました。


にはこうありますが、「うまく動作した」のなら、質問は解決したはずです。それを放置したままというのは如何なものでしょう?

id:takanii

実行環境をcoreserverからサクラレンタルサーバーに移動しましたらいけました。
ありがとうございました。

2013/04/13 22:24:20

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982013/04/12 06:25:07

ポイント150pt
<?php
mb_language("Japanese");
mb_internal_encoding("utf-8");
$str = file_get_contents("http://headlines.yahoo.co.jp/hl");
$str = mb_convert_encoding($str, "utf-8", "auto");
preg_match("/<ul id=\"gnSec\">(.+?)<\/ul>/ismu", $str, $arr);
$patterns = array();
$patterns[0] = "/^<meta.*\n/mu";
$replacements = array();
$replacements[0] = '';
$sResult = preg_replace($patterns, $replacements, $arr[1]);
file_put_contents("new.txt", $sResult);
$file_new = file("new.txt", FILE_IGNORE_NEW_LINES);
$file_old = file("old.txt", FILE_IGNORE_NEW_LINES);
mb_convert_variables( 'UTF-8' , 'auto' , $file_old );
$result = array_diff($file_new , $file_old);
file_put_contents("diff.txt", join("\n", $result));
?>

これでどうでしょうか?

id:tezcello No.2

tezcello回答回数457ベストアンサー獲得回数682013/04/12 12:15:11ここでベストアンサー

ポイント150pt

他人の作ったデータをスクレイピングするには、(現状は)実際にどんなデータが取得できているのかを把握するのが最初です。

質問者さんの取得したいデータは、本当に「http://headlines.yahoo.co.jp/hl」のものでしょうか?
だとしたら、id="gnSec" の ul には meta は存在せず、単純な li が並んでいるので $arr[1] から $sResult を作っている preg_replace() は不要ですね。

そして、実際に取得できたデータ( new.txt へ保存したもの)をエディタで確認されていますか?
そして、 old.txt に予め書いておいたデータ(ですよね?)と同じ書式になっていますか?
ご確認頂ければすぐに解りますが、各行の先頭にスペースが8個存在します。
これを除去するのはいろいろ方法がありますけど、せっかく複数の置換が出来るように用意しているので、
$patterns[1] = '/\s*\n\s*/';
$replacements[1] = "\n";
とでもするのはいかがでしょうか。
__改行文字の前後に複数の空白系文字がある場合は一つの改行だけにする

データの先頭に改行が入っているのが気持ち悪いので、同様に正規表現を追加して削除するか、$arr[1] か $sResult のどちらかを trim() または ltrim() で削除したらどうでしょうか?

$sResult の生成時に、不要な部分を削除するのではなく、必要な部分を取り出す方が良かったのかもしれません。


(以下蛇足)
先の質問 http://q.hatena.ne.jp/1365680308

http://q.hatena.ne.jp/1365606294 と②http://q.hatena.ne.jp/1365546701 の質問の続きです
...
①だけのphp ②だけのphp を実行した場合はうまく動作ました。


にはこうありますが、「うまく動作した」のなら、質問は解決したはずです。それを放置したままというのは如何なものでしょう?

id:takanii

実行環境をcoreserverからサクラレンタルサーバーに移動しましたらいけました。
ありがとうございました。

2013/04/13 22:24:20

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません