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 に書き出され、置換条件が実行されていません
どこがダメなのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/04/10 23:02:48
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント150pt
$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);
?>
id:a-kuma3

置換条件をもう一つ追加する場合はどうすればいいのでしょうか?

マッチしたパターンの内容を消したい、ということであれば、preg_replace に渡すパターンの配列を増やすだけでできます。

<?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);
?>

# 余計なお世話だったら、ごめんなさい

2013/04/10 23:22:40
id:takanii

いえいえ、ありがとうございました!!

2013/04/10 23:23:22
id:asatoryu No.2

回答回数66ベストアンサー獲得回数14

ポイント150pt

問題点
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);
?>
id:takanii

置換条件をもう一つ追加する場合はどうすればいいのでしょうか?

2013/04/10 21:31:03
id: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);
でよろしいでしょうか?

2013/04/10 21:39:19

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

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

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

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