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

Перезаписать строку в файле с помощью PHP

Каков наилучший способ перезаписи определенной строки в файле? Я в основном хочу искать файл для строки "@parsethis" и перезаписывать остальную часть этой строки чем-то другим.

4b9b3361

Ответ 1

Если файл не слишком большой, лучшим способом, вероятно, будет чтение файла в массив строк с file(), выполните поиск по массиву строк для вашей строки и отредактируйте эту строку, затем implode() массив назад и fwrite() обратно в файл.

Ответ 2

Если файл действительно большой (файлы журналов или что-то в этом роде), и вы готовы пожертвовать скоростью для потребления памяти, вы можете открыть два файла и по существу сделать трюк Джереми Рутен, предлагаемые с использованием файлов вместо системной памяти.

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);

Ответ 3

Основная проблема заключается в том, что новая строка может быть не такой же длины, как у старой строки. Если вам нужно изменить длину строки, нет пути перезаписи, по крайней мере, всего файла после измененной строки. Самый простой способ - создать новый, измененный файл, а затем переместить его поверх оригинала. Таким образом, для читателей всегда доступен полный файл. Используйте блокировку, чтобы убедиться, что только один script одновременно изменяет файл, и поскольку вы собираетесь заменить файл, выполните блокировку в другом файле. Проверьте flock().

Если вы уверены, что новая строка будет такой же длины, как и в старой строке, вы можете открыть файл в режиме чтения/записи (используйте r+ в качестве второго аргумента для fopen()) и вызовите ftell() для сохранения позиции, в которой линия запускается каждый раз, прежде чем вы вызовете fgets(), чтобы прочитать строку. Когда вы найдете строку, которую хотите переписать, вы можете использовать fseek(), чтобы вернуться к началу строки и fwrite() новых данных. Один из способов заставить линию всегда иметь одинаковую длину, - это простое место для максимальной длины.

Ответ 4

или если ваш файл не слишком большой:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

Вам нужно будет выбрать разделители '#', которые не присутствуют в файле.

Ответ 5

Я бы скорее всего сделал то, что предложил Джереми, но просто для альтернативного способа сделать это здесь - другое решение. Это не было протестировано или использовано и предназначено для систем * nix.

$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""