web-dev-qa-db-ja.com

PHP)のファイルコンテンツを置き換える

preg_replace のような関数が必要ですが、文字列の代わりに、ファイル/ファイルコンテンツを処理するために必要です。

19
Emanuil Rusev

できるよ:

$file = 'filename';
file_put_contents($file,str_replace('find','replace',file_get_contents($file)));
49
codaddict

@codaddictの答えは、小さなファイルには十分です(ファイルのサイズがMiB未満の場合、どのように実装するかということです)。ただし、大量のメモリを消費するため、大きなファイルを読み取る場合は注意が必要です。

よりメモリに優しいバージョンが必要な場合は、 ストリームフィルター ...を使用できます。

class ReplaceText_filter extends php_user_filter {
    protected $search = '';
    protected $replace = '';

    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writable($in)) {
            $bucket->data = str_replace(
                $this->search, 
                $this->replace, 
                $bucket->data
            );
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }

    public function onCreate() {
        if (strpos($this->filtername, '.') === false) return false;
        list ($name, $arguments) = explode('.', $this->filtername, 2);
        $replace = '';
        $search = $arguments;
        if (strpos($arguments, '|') !== false) {
            list ($search, $replace) = explode('|', $arguments, 2);
        }
        if (strpos($search, ',') !== false) {
            $search = explode(',', $search);
        }
        if (strpos($replace, ',') !== false) {
            $search = explode(',', $replace);
        }
        $this->search = $search;
        $this->replace = $replace;
    }
}
stream_filter_register('replacetext.*', 'ReplaceText_Filter');

したがって、任意のストリームフィルターを追加できます。フィルタの名前によって引数が決まります。

$search = 'foo';
$replace = 'bar';
$name = 'replacetext.'.$search.'|'.$replace;
stream_filter_append($stream, $name);

またはアレイの場合、

$search = array('foo', 'bar');
$replace = array('bar', 'baz');
$name = 'replacetext.'.implode(',', $search).'|'.implode(',', $replace);
stream_filter_append($stream, $name);

明らかに、これは非常に単純な例です(そして、多くのエラーチェックを行いません)が、次のようなことを行うことができます。

$f1 = fopen('mysourcefile', 'r');
$f2 = fopen('mytmpfile', 'w');
$search = array('foo', 'bar');
$replace = array('bar', 'baz');
$name = 'replacetext.'.implode(',', $search).'|'.implode(',', $replace);
stream_filter_append($f1, $name);
stream_copy_to_stream($f1, $f2);
fclose($f1);
fclose($f2);
rename('mytmpfile', 'mysourcefile');

そしてそれは潜在的に巨大な(GiBまたはTiB)ファイルを処理している間メモリ使用量を非常に低く保ちます...

ああ、そして他のクールなことは、それが異なるストリームタイプをインライン編集できることです。つまり、HTTPストリームからの読み取り、インライン編集、ファイルストリームへの書き込みが可能です。それは非常に強力です(これらのフィルターをチェーンできるため)...

21
ircmaxell
<?php

$pattern = "/created/";
$replacement = "XXXXX";
$file_name = "regex.txt";
$getting_file_contents = file_get_contents($file_name);

echo("Original file contents : " . "<br><br>");
var_dump($getting_file_contents);
echo("<br><br><br>");

if ($getting_file_contents == true) {
  echo($file_name . " had been read succesfully" . "<br><br><br>");

  $replace_data_in_file = preg_replace($pattern, $replacement, $getting_file_contents);
  $writing_replaced_data = file_put_contents($file_name, $replace_data_in_file);
  echo("New file contents : " . "<br><br>");
  var_dump($replace_data_in_file);
  echo("<br><br>");

  if ($writing_replaced_data == true) {
    echo("Data in the file changed");
  }
  else {
    exit("Cannot change data in the file");
  }
}
else {
  exit("Unable to get file contents!");
}

?>
0
DarkReverser