Sovrascrivi Line in File con PHP

Qual è il modo migliore per sovrascrivere una linea specifica in un file? Fondamentalmente voglio cercare un file per la string '@parsethis' e sovrascrivere il resto di quella linea con qualcos'altro.

Se il file non è troppo grande, il modo migliore sarebbe probabilmente quello di leggere il file in una serie di linee con file () , cercare nella matrix di linee per la string e modificare quella linea, quindi implodere () l'arrays indietro insieme e fwrite () torna al file.

Se il file è veramente grande (file di registro o qualcosa del genere) e si è disposti a sacrificare la velocità per il consumo di memory, è ansible aprire due file e essenzialmente eseguire il trucco proposto da Jeremy Ruten utilizzando i file anziché la memory di sistema.

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

Il tuo problema principale è il fatto che la nuova linea potrebbe non avere la stessa lunghezza della vecchia linea. Se è necessario modificare la lunghezza della linea, non c'è modo di riscrivere alless tutto il file dopo la row modificata. Il modo più semplice è creare un nuovo file modificato e quindi spostarlo sull'originale. In questo modo c'è un file completo disponibile in each momento per i lettori. Usa il block per assicurarti che solo uno script stia modificando il file in una volta, e dal momento che stai per sostituire il file, esegui il block su un altro file. Controlla il flock() .

Se sei sicuro che la nuova linea avrà la stessa lunghezza della vecchia linea, puoi aprire il file in modalità lettura / scrittura (usa r+ come secondo argomento per fopen() ) e chiama ftell() per salvare la posizione la row inizia each volta prima di call fgets() per leggere una row. Una volta trovata la linea che si desidera sovrascrivere, è ansible utilizzare fseek() per tornare all'inizio della row e fwrite() i nuovi dati. Un modo per forzare la linea a essere sempre della stessa lunghezza è di spaziarlo fino alla massima lunghezza ansible.

o se il tuo file non è troppo grande:

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

Dovrai scegliere i "delimitatori" che non sono presenti nel file.

Molto probabilmente farei ciò che Jeremy ha suggerito, ma solo per un modo alternativo di farlo qui è un'altra soluzione. Questo non è stato testato o utilizzato ed è per sisthemes * 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 ""