Maison > Questions et réponses > le corps du texte
Comment remplacer des lignes de texte spécifiques dans un fichier en utilisant php ?
Je ne connais pas le numéro de ligne. Je souhaite remplacer les lignes contenant des mots spécifiques.
P粉1387117942023-10-19 13:40:07
Vous devez écraser l'intégralité du fichier.
Donc, pour un fichier relativement petit, lisez le fichier dans un tableau , recherchez le mot, remplacez les lignes trouvées et écrivez tout le reste dans le fichier.
Pour les gros fichiers, l'algorithme est légèrement différent, mais globalement c'est exactement le même.
La partie importante est le Verrouillage de fichiers
C'est pourquoi nous préférons les bases de données.
P粉1557104252023-10-19 13:24:24
Une méthode qui peut être utilisée pour des fichiers plus petits qui tiennent dans votre mémoire deux fois :
$data = file('myfile'); // reads an array of lines function replace_a_line($data) { if (stristr($data, 'certain word')) { return "replacement line!\n"; } return $data; } $data = array_map('replace_a_line', $data); file_put_contents('myfile', $data);
Remarque rapide, PHP > 5.3.0 prend en charge les fonctions lambda, vous pouvez donc supprimer la déclaration de fonction nommée et raccourcir le mappage à :
$data = array_map(function($data) { return stristr($data,'certain word') ? "replacement line\n" : $data; }, $data);
Théoriquement, vous pourriez en faire une seule déclaration php (plus difficile à suivre) :
file_put_contents('myfile', implode('', array_map(function($data) { return stristr($data,'certain word') ? "replacement line\n" : $data; }, file('myfile')) ));
Pour les fichiers plus volumineuxune autre méthode (moins gourmande en mémoire) doit être utilisée :
$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'); }