Операции по изменению данных в файлах с помощью 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}}.