Операции по изменению данных в файлах с помощью PHP

Раздел: Работа с файлами в PHP -> Операции с файловой системой

Редактирование файлов в PHP: основные подходы

Наиболее эффективный и универсальный способ для большинства задач - комбинация функций file_get_contents() и file_put_contents(). Эти функции позволяют прочитать содержимое файла в строку, выполнить необходимые модификации и записать результат обратно. Такой подход оптимален для файлов размером до нескольких десятков мегабайт при условии достаточного объема памяти.

$file = 'example.txt';
$data = file_get_contents($file);
$data = str_replace('old', 'new', $data);
file_put_contents($file, $data);

Php редактировать файл (редактирование содержимого файла в php)

Пояснение: строка file_get_contents загружает всё содержимое, str_replace выполняет замену, а file_put_contents записывает результат. Для множественных замен можно передавать массивы.

Основные проблемы: недоступность файла для записи, превышение лимита памяти, частичная запись при ошибке. Решения: проверка прав через is_writable(), увеличение memory_limit, использование файловой блокировки flock() или запись во временный файл с последующим переименованием.

Как заменить текст по регулярному выражению?

Функция preg_replace() применяется для поиска и замены по шаблону. Подходит для удаления комментариев, изменения форматирования, сложных замен.

$conf = file_get_contents('settings.ini');
$conf = preg_replace('/^;.*$/m', '', $conf);
file_put_contents('settings.ini', $conf);

Php заменить файл (замена содержимого файла в php (перезапись))

Цель: очистка INI-файла от комментариев (строки, начинающиеся с точки с запятой).

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

Как отредактировать большой файл без загрузки в память целиком?

Для файлов размером свыше 100 МБ используйте построчное чтение и запись во временный файл. Функции fopen(), fgets(), fwrite() позволяют обрабатывать данные потоком.

$src = fopen('large.log', 'r');
$tmp = fopen('large_new.log', 'w');
while (($line = fgets($src)) !== false) {
    $modified = str_replace('ERROR', 'WARNING', $line);
    fwrite($tmp, $modified);
}
fclose($src);
fclose($tmp);
rename('large_new.log', 'large.log');

Php получить имя файла (получение имени файла из пути в php)

Используется атомарная замена через временный файл. При ошибке записи исходный файл остаётся нетронутым.

Проблемы: дисковое пространство при копировании, права на создание файла, необходимость синхронизации при параллельном доступе (flock может помочь).

Как редактировать JSON-файл?

JSON-файлы декодируются в массив или объект, модифицируются и кодируются обратно. Функции json_decode() и json_encode() с флагами JSON_PRETTY_PRINT сохраняют форматирование.

$json = file_get_contents('data.json');
$arr = json_decode($json, true);
$arr['new_key'] = 'value';
file_put_contents('data.json', json_encode($arr, JSON_PRETTY_PRINT));

Php информация о файле (получение информации о файле в php)

Цель: добавление новой записи в конфигурационный файл.

Ошибки: некорректный JSON при парсинге (проверьте json_last_error()), потеря данных при сбое записи, проблемы с кодировкой (используйте JSON_UNESCAPED_UNICODE для русских символов).

Как безопасно изменить INI-файл?

Можно использовать parse_ini_file() для чтения, затем file_put_contents() с генерацией строк. Для сохранения комментариев и структуры лучше применять построчный разбор.

$ini = parse_ini_file('config.ini', true);
$ini['database']['host'] = 'localhost';
$out = '';
foreach ($ini as $section => $values) {
    $out .= "[$section]\n";
    foreach ($values as $key => $val) {
        $out .= "$key = $val\n";
    }
}
file_put_contents('config.ini', $out);

Php переименовать файл (переименование файла в php)

Пояснение: простой способ, но теряет комментарии. Для точного редактирования - регулярные выражения или построчная обработка.

Проблемы: потеря форматирования, экранирование спецсимволов, ошибки при наличии секций с точками.

Как редактировать XML-файл?

Для XML используйте SimpleXML или DOMDocument. Пример с SimpleXML:

$xml = simplexml_load_file('data.xml');
$xml->item[0]->name = 'New Name';
$xml->asXML('data.xml');

Цель: изменение значения элемента.

Ошибки: невалидный XML, проблемы с пространствами имен, потеря форматирования (asXML не сохраняет отступы, для этого DOMDocument с форматированием).

Расширенные примеры редактирования файлов

Пример 1. Атомарная замена содержимого с использованием временного файла и блокировки.

Пример
$file = 'important.txt';
$tmp = tempnam(sys_get_temp_dir(), 'TMP');
$fh = fopen($file, 'r');
$fw = fopen($tmp, 'w');
if (flock($fh, LOCK_SH)) {
    while (($line = fgets($fh)) !== false) {
        fwrite($fw, str_replace('password', '***', $line));
    }
    flock($fh, LOCK_UN);
}
fclose($fh);
fclose($fw);
rename($tmp, $file); // атомарно
Файл important.txt обновлён без потери данных при сбое.

Пример 2. Добавление номеров строк в текстовый файл.

Пример
$input = 'source.txt';
$output = 'numbered.txt';
$f = fopen($input, 'r');
$g = fopen($output, 'w');
$n = 1;
while (($line = fgets($f)) !== false) {
    fwrite($g, sprintf('%4d: %s', $n++, $line));
}
fclose($f);
fclose($g);
В файле numbered.txt каждая строка начинается с номера.

Пример 3. Редактирование CSV-файла: добавление колонки с хешем.

Пример
$file = 'users.csv';
$rows = array_map('str_getcsv', file($file));
$header = $rows[0];
$header[] = 'hash';
foreach ($rows as $i => &$row) {
    if ($i == 0) continue;
    $row[] = md5($row[0]);
}
$fp = fopen($file, 'w');
foreach ($rows as $row) {
    fputcsv($fp, $row);
}
fclose($fp);
CSV-файл обновлён: добавлен столбец hash с md5 от первого поля.

Пример 4. Использование SplFileObject для итерации и замены.

Пример
$file = new SplFileObject('data.txt', 'r+');
$file->flock(LOCK_EX);
$lines = [];
foreach ($file as $line) {
    $lines[] = str_replace('old', 'new', $line);
}
$file->fseek(0);
$file->ftruncate(0);
foreach ($lines as $line) {
    $file->fwrite($line);
}
$file->flock(LOCK_UN);
Метод работает, но для больших файлов может быть неэффективен.

Пример 5. Замена только первого вхождения строки.

Пример
function replace_first($search, $replace, $subject) {
    $pos = strpos($subject, $search);
    if ($pos !== false) {
        return substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}
$content = file_get_contents('template.html');
$content = replace_first('{{title}}', 'New Title', $content);
file_put_contents('template.html', $content);
Заменён только первый шаблон {{title}}.

Редактирование содержимого файла в PHP - comments

En
Php редактировать файл (php)