人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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>
**************

●質問者: takanii
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●150ポイント
<?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));
?>

これでどうでしょうか?


2 ● tezcello
●150ポイント ベストアンサー

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

質問者さんの取得したいデータは、本当に「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 を実行した場合はうまく動作ました。


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


takaniiさんのコメント
実行環境をcoreserverからサクラレンタルサーバーに移動しましたらいけました。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ