recherche

Maison  >  Questions et réponses  >  le corps du texte

Remplacer une ligne entière dans un fichier texte lorsqu'un mot spécifique est rencontré

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粉883278265P粉883278265432 Il y a quelques jours485

répondre à tous(2)je répondrai

  • P粉138711794

    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.

    répondre
    0
  • P粉155710425

    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');
    }

    répondre
    0
  • Annulerrépondre