Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中替换文件内容_Php_File_File Io_Preg Replace_Replace - Fatal编程技术网

在PHP中替换文件内容

在PHP中替换文件内容,php,file,file-io,preg-replace,replace,Php,File,File Io,Preg Replace,Replace,我需要一个与字符串类似的函数,但我需要它来处理文件/文件内容。您可以执行以下操作: $file = 'filename'; file_put_contents($file,str_replace('find','replace',file_get_contents($file))); @codaddict的答案对于小文件来说已经足够了(如果文件的大小在MiB之下,我将如何实现它)。但是,它会消耗大量内存,因此在读取大文件时应小心 如果你想要一个内存更友好的版本,你可以使用 因此,您可以附加任意

我需要一个与字符串类似的函数,但我需要它来处理文件/文件内容。

您可以执行以下操作:

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

@codaddict的答案对于小文件来说已经足够了(如果文件的大小在MiB之下,我将如何实现它)。但是,它会消耗大量内存,因此在读取大文件时应小心

如果你想要一个内存更友好的版本,你可以使用

因此,您可以附加任意流过滤器。筛选器的名称决定了参数:

$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流读取、内联编辑和写入文件流。它非常强大(因为您可以链接这些过滤器).



您可以通过使用fread循环将文件内容拉入变量,然后使用preg_replace,就像使用字符串一样?是的,但是更新的内容应该写入它所取自的文件中。那么,将内容写回文件有什么问题呢?您可以使用Unix实用程序
sed
.PHP支持字符串中的二进制数据。注意:手册中有一条注释,即preg fns不喜欢大于~100k的字符串。但是,它可能会遇到源字符串中的null字符的问题-因此,以最大(比如)10k的块(由null分隔)读取文件,去掉任何尾随的null(并将其保留到以后),将preg应用于每个区块,并再次写出它。如果删除了一个区块,则添加null back。这个答案的唯一问题是搜索词位于多个区块之间,特别是在处理大于8 KiB的文件时。您可以对这段代码添加一些解释吗?否则它将被归类为低质量的应答器。对于它的基本php函数,您可以从
$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');
<?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!");
}

?>