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

PHPの質問です
http://q.hatena.ne.jp/1365520599 の続きです
a.php
*******************************************
<?php
mb_internal_encoding("utf-8");
$filename = "a.txt";
$url = "http://headlines.yahoo.co.jp/hl";
$str = file_get_contents($url);
$str = mb_convert_encoding($str, "utf-8", "auto");
preg_match("/<head>(.+?)<\/head>/ismu", $str, $arr);
$sSearch = array();
$sSearch[0] = '<script type="text/javascript">\r\n';
$sSearch[1] = '^<meta.*\r\n';
$sReplace = array();
$sReplace[0] = '';
$sReplace[1] = '';
$sResult = str_replace($sSearch, $sReplace, $arr[1]);
file_put_contents($filename, $sResult);
?>
*******************
複数条件で置換したいと思い、
a.phpというのを作り実行したのですが
URL 先の head タグの中身がそのまま a.txt に書き出され、置換条件が実行されていません
どこがダメなのでしょうか?

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

▽最新の回答へ

1 ● a-kuma3
●150ポイント
$sSearch[0] = '<script type="text/javascript">\r\n';
$sSearch[1] = '^<meta.*\r\n';

$sSearch[0] の方が置き換わらない理由は、シングルクォートでくくっていることと、改行コードが違ってることです。
$sSearch[1] の方は、正規表現を使っているからです。str_replace() は、正規表現を解釈しません。
http://php.net/manual/ja/function.str-replace.php


こんな感じでどうでしょうか。

<?php
 mb_internal_encoding("utf-8");
 $filename = "a.txt";
 $url = "http://headlines.yahoo.co.jp/hl";
 $str = file_get_contents($url);
 $str = mb_convert_encoding($str, "utf-8", "auto");
 preg_match("/<head>(.+?)<\/head>/ismu", $str, $arr);

 $sSearch = array();
 $sSearch[0] = '/<script type="text\/javascript">\n/';
 $sSearch[1] = '/^<meta.*\n/m';
 $sReplace = '';
 $sResult = preg_replace($sSearch, $sReplace, $arr[1]);

 file_put_contents($filename, $sResult);
?>

preg_replace() 関数を使い、正規表現も少し手を入れてます。

んで、ひとつ目の条件は、script タグを中身ごと消したいんじゃないか、という気がしたので、script タグを丸ごと消すパターンも書いておきます。。

<?php
 mb_internal_encoding("utf-8");
 $filename = "a.txt";
 $url = "http://headlines.yahoo.co.jp/hl";
 $str = file_get_contents($url);
 $str = mb_convert_encoding($str, "utf-8", "auto");
 preg_match("/<head>(.+?)<\/head>/ismu", $str, $arr);

 $sSearch = array();
 $sSearch[0] = '/<script type="text\/javascript">.*?<\/script>\n/s';
 $sSearch[1] = '/^<meta.*\n/m';
 $sReplace = '';
 $sResult = preg_replace($sSearch, $sReplace, $arr[1]);

 file_put_contents($filename, $sResult);
?>

a-kuma3さんのコメント
>> 置換条件をもう一つ追加する場合はどうすればいいのでしょうか? << マッチしたパターンの内容を消したい、ということであれば、preg_replace に渡すパターンの配列を増やすだけでできます。 >|php| <?php mb_internal_encoding("utf-8"); $filename = "a.txt"; $url = "http://headlines.yahoo.co.jp/hl"; $str = file_get_contents($url); $str = mb_convert_encoding($str, "utf-8", "auto"); preg_match("/<head>(.+?)<\/head>/ismu", $str, $arr); $sSearch = array(); $sSearch[0] = '/<script type="text\/javascript">.*?<\/script>\n/s'; $sSearch[1] = '/^<meta.*\n/m'; $sSearch[2] = '...'; // ★ここに追加したい条件を指定する $sReplace = ''; $sResult = preg_replace($sSearch, $sReplace, $arr[1]); file_put_contents($filename, $sResult); ?> ||< # 余計なお世話だったら、ごめんなさい

takaniiさんのコメント
いえいえ、ありがとうございました!!

2 ● asatoryu
●150ポイント

問題点
1.検索文字$sSearchに改行記号\nを入れるときは、文字列をダブルクォーテーションで囲む必要があります。
2.str_replaceは正規表現が通らないので、$sSearch[1]の検索で失敗します。preg_replaceを使うようにします。あわせて$sSearch[1]の書き方を修正しました。

<?php
mb_internal_encoding("utf-8");
$filename = "a.txt";
$url = "http://headlines.yahoo.co.jp/hl";
$str = file_get_contents($url);
$str = mb_convert_encoding($str, "utf-8", "auto");
preg_match("/<head>(.+?)<\/head>/ismu", $str, $arr);
$sSearch = array();
$sSearch[0] = "<script type=\"text/javascript\">\n"; //ダブルクォーテーション
$sSearch[1] = "/^<meta.*\n/mu"; //正規表現;
$sReplace = array();
$sReplace[0] = '';
$sReplace[1] = '';

//置換1
$sResult = str_replace($sSearch[0], $sReplace[0], $arr[1]);
//置換2
$sResult = preg_replace($sSearch[1], $sReplace[1], $sResult);

file_put_contents($filename, $sResult);
?>

takaniiさんのコメント
置換条件をもう一つ追加する場合はどうすればいいのでしょうか?

takaniiさんのコメント
$sResult = preg_replace($sSearch[0], $sReplace[0], $arr[1]); $sResult = preg_replace($sSearch[1], $sReplace[1], $sResult); $sResult = preg_replace($sSearch[2], $sReplace[2], $sResult); でよろしいでしょうか?
関連質問

●質問をもっと探す●



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