Подтвердить что ты не робот

Как заменить определенную строку в текстовом файле с помощью php?

как заменить определенную строку с помощью php. Я не знаю номер строки. Я хочу заменить строку, содержащую определенное слово.

4b9b3361

Ответ 1

Один подход, который вы можете использовать для небольших файлов, которые могут вставляться в вашу память дважды:

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

Быстрая заметка, PHP > 5.3.0 поддерживает функции лямбда, поэтому вы можете удалить декларацию названной функции и сократить карту до:

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

Теоретически вы могли бы сделать это одним (сложнее следовать) выражением php:

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

Другой (менее интенсивный объем памяти) подход, который вы должны использовать для больших файлов:

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

Ответ 2

Вы должны перезаписать весь файл.

Итак, для относительно небольшого файла прочитать файл в массив, найти слово, заменить найденную строку, написать все остальное в file.

Для большого файла алгоритм немного отличается, но в целом он вообще такой же.

Важная часть блокировка файла

почему мы предпочитаем базу данных.

Ответ 3

Вы также можете использовать многострочный режим с регулярными выражениями

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

Это, конечно же, предполагает, что это маленький документ на готовом и загруженном. В противном случае другие ответы гораздо более "реальны" для решения.

Ответ 4

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

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

Теперь $newdata содержит содержимое файла в виде массива (используйте implode(), если вы не хотите, чтобы массив), а строка, содержащая замену replaceme, была заменена на "tome".

Ответ 5

Если вы не знаете строку, вам придется искать по всем строкам.

Либо итерация по файлу строка за строкой, либо читает файл в памяти сразу. Затем либо найдите слово с комбинацией strpos и str_replace или используйте preg_replace.

Если вы выполните итерацию, просто используйте strpos и замените строку, если она не вернет FALSE. Затем сохраните файл на диске.

Ответ 6

Это хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.

Код:

$id = "123";
$new_line = "123,Programmer\r"; // We're not changing the ID, so ID 123 remains.
$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
    $contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents);
    foreach ($contents_array as &$record) {    // for each line
        if (strpos($record, $id) !== false) { // if we have found the correct line
            $new_contents .= $new_line; // change record to new record
        }else{
            $new_contents .= $record . "\r";
        }
    }
    file_put_contents($dir, $new_contents); // save the records to the file
    echo json_encode("Successfully updated record!");
}
else{
    echo json_encode("failed - user ID ". $id ." doesn't exist!");
}

Пример:

Старый файл:

ID, род занятий

123, студент

124, слой кирпича

Запуск кода изменит файл на:

Новый файл:

ID, род занятий

123, программист

124, слой кирпича

Ответ 7

Возможно, это могло бы помочь:

$data = file("data.php");

for($i = 0;$i<count($data);$i++){
    echo "<form action='index.php' method='post'>";
    echo "<input type='text' value='$data[$i]' name='id[]'><br>";
}

echo "<input type='submit' value='simpan'>";
echo "</form>";

if(isset($_POST['id'])){
    file_put_contents('data.php',implode("\n",$_POST['id'])) ;
}