how to replace a particular line in a text file using php?

Solution 1:

One approach that you can use on smaller files that can fit into your memory twice:

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

A quick note, PHP > 5.3.0 supports lambda functions so you can remove the named function declaration and shorten the map to:

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

You could theoretically make this a single (harder to follow) php statement:

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

Another (less memory intensive) approach that you should use for larger files:

$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');
}

Solution 2:

You have to overwrite the entire file.

So, for the relatively small file, read file into array, search for the word, replace found row, write all the rest into file.

For the big file the algorithm is slightly different, but quite the same in general.

Important part is file locking

that's why we prefer a database.

Solution 3:

You can also use multi-line mode with regular expressions

preg_match_all('/word}/m', $textfile, $matches);

this is, of course, assuming it's a smaller document at the ready and loaded. Otherwise, the other answers are far more 'real-world' of a solution.

Solution 4:

If you don't know the line, you will have to search over all lines.

Either iterate over the file line by line or read the file into memory all at once. Then either find the word with a combination of strpos and str_replace or use preg_replace.

If you iterate, simply use strpos and replace the line once it didn't return FALSE. Then save the file back to disk.

Solution 5:

$filedata = file('filename');
$newdata = array();
$lookfor = 'replaceme';
$newtext = 'withme';

foreach ($filedata as $filerow) {
  if (strstr($filerow, $lookfor) !== false)
    $filerow = $newtext;
  $newdata[] = $filerow;
}

Now $newdata contains the file contents as an array (use implode() if you don't want array) with the line containing "replaceme" replaced with "withme".