搜尋

首頁  >  問答  >  主體

當遇到特定單字時替換文字檔案中的整行

如何使用 php 替換檔案中的特定文字行?

我不知道行號。我想替換包含特定單字的行。

P粉883278265P粉883278265422 天前474

全部回覆(2)我來回復

  • P粉138711794

    P粉1387117942023-10-19 13:40:07

    您必須覆寫整個檔案。

    因此,對於相對較小的文件,將文件讀入數組,搜尋單詞,替換找到的行,將所有其餘內容寫入文件

    對於大文件,演算法略有不同,但總體上完全相同。

    重要的部分是檔案鎖定

    這就是我們更喜歡資料庫的原因。

    回覆
    0
  • P粉155710425

    P粉1557104252023-10-19 13:24:24

    一種可以用於適合您記憶體的較小檔案的方法兩次

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

    快速說明一下,PHP > 5.3.0 支援 lambda 函數,因此您可以刪除命名函數宣告並將映射縮短為:

    $data = array_map(function($data) {
      return stristr($data,'certain word') ? "replacement line\n" : $data;
    }, $data);

    理論上,您可以將其設為單一(更難遵循)php 語句:

    file_put_contents('myfile', implode('', 
      array_map(function($data) {
        return stristr($data,'certain word') ? "replacement line\n" : $data;
      }, file('myfile'))
    ));

    對於較大的檔案應該使用另一種(記憶體佔用較少的)方法:

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

    回覆
    0
  • 取消回覆