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 に書き出され、置換条件が実行されていません
どこがダメなのでしょうか?
$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); ?>
問題点
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); ?>
置換条件をもう一つ追加する場合はどうすればいいのでしょうか?
$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);
でよろしいでしょうか?
マッチしたパターンの内容を消したい、ということであれば、preg_replace に渡すパターンの配列を増やすだけでできます。
# 余計なお世話だったら、ごめんなさい
2013/04/10 23:22:40いえいえ、ありがとうございました!!
2013/04/10 23:23:22