如何使用PHP替换文本文件中的特定行?

kis*_*ore 36 php

如何使用PHP替换特定行.我不知道行号.我想替换包含特定单词的行.

gna*_*arf 52

您可以在可以适合您的内存两次的较小文件上使用的一种方法:

$data = file('myfile'); // reads an array of lines
function replace_a_line($data) {
   if (stristr($data, 'certain word')) {
     return "replaement line!\n";
   }
   return $data;
}
$data = array_map('replace_a_line',$data);
file_put_contents('myfile', implode('', $data));
Run Code Online (Sandbox Code Playgroud)

快速说明,PHP> 5.3.0支持lambda函数,因此您可以删除指定的函数声明并将映射缩短为:

$data = array_map(function($data) {
  return stristr($data,'certain word') ? "replacement line\n" : $data;
}, $data);
Run Code Online (Sandbox Code Playgroud)

理论上你可以将它作为单个(更难遵循)的php语句:

file_put_contents('myfile', implode('', 
  array_map(function($data) {
    return stristr($data,'certain word') ? "replacement line\n" : $data;
  }, file('myfile'))
));
Run Code Online (Sandbox Code Playgroud)

您应该用于较大文件的另一种(内存不太密集)方法:

$reading = fopen('myfile', 'r');
$writing = fopen('myfile.tmp', 'w');

$replaced = false;

while (!feof($reading)) {
  $line = fgets($reading);
  if (stristr($line,'certain word')) {
    $line = "replacement line!\n";
    $replaced = true;
  }
  fputs($writing, $line);
}
fclose($reading); fclose($writing);
// might as well not overwrite the file if we didn't replace anything
if ($replaced) 
{
  rename('myfile.tmp', 'myfile');
} else {
  unlink('myfile.tmp');
}
Run Code Online (Sandbox Code Playgroud)


You*_*nse 7

您必须覆盖整个文件.

因此,对于相对较小的文件,将文件读入数组,搜索单词,替换找到的行,将所有其余的写入文件.

对于大文件,算法略有不同,但总的来说完全相同.

重要的部分是文件锁定

这就是为什么我们更喜欢数据库.