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回まで
  • 登録:
  • 終了:2013/04/13 22:24:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント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

回答回数13539ベストアンサー獲得回数1198

ポイント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

回答回数460ベストアンサー獲得回数69ここでベストアンサー

ポイント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

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

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

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

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

回答リクエストを送信したユーザーはいません