2013-08-27 51 views
1

我有一個文件users.txt其中包含:PHP - 編輯在文件/刪除特定行

"ID" "Access" ;Expire>>26-08-2013<< 
"ID" "Access" ;Expire>>27-08-2013<< 
"ID" "Access" ;Expire>>28-08-2013<< 

我wan't檢查是否過期日期比當前日期時間時,如果是的話我想在該行的開頭添加分號或簡單地刪除該行。

我寫了這麼遠了,代碼如下:

$files = file('users.txt'); 
foreach ($files as $line) { 

    $pattern = '/>>(.*)<</'; 
    preg_match($pattern, $line, $matches); 
    $expiredate = strtotime($matches[1]); 
    $currdate = strtotime(date('d-m-Y')); 
    if ($currdate > $expiredate) { 
     echo 'access expired... edit/delete the line<br/>'; 
    } else { 
     echo 'do nothing, its ok -> switching to the next line...<br/>'; 
    } 

} 

它檢索從文件中每一行的「到期日」。它還檢查它是否大於當前日期,但此時我不知道如何編輯(通過在開始處添加分號)或刪除滿足條件的行。

有什麼建議嗎?

+0

我猜:發現DBMS –

+1

如果問題涉及DBMS我甚至不會要求。但是我正在處理的項目包含數據在一個文件中。 – Marcin

+0

告訴項目經理或老師他(他)是小白,並且必須爲您提供正確的工具。一個極端的解決方案是:1.將文件解析爲數據庫(如果您處於低資源設置,請檢查SQLite)2.使用新數據庫詳細說明3.設計具有所需格式的數據庫導出例程?? 5.利潤! –

回答

5

嘗試像這樣的:

$files = file('users.txt'); 

$new_file = array(); 
foreach ($files as $line) { 

    $pattern = '/>>(.*)<</'; 
    preg_match($pattern, $line, $matches); 
    $expiredate = strtotime($matches[1]); 
    $currdate = strtotime(date('d-m-Y')); 
    if ($currdate > $expiredate) { 
     // For edit 
     $line = preg_replace('/condition/', 'replace', $line); // Edit line with replace 
     $new_file[] = $line; // Push edited line 

     //If you delete the line, do not push array and do nothing 
    } else { 
     $new_file[] = $line; // push line new array 
    } 
} 

file_put_contents('users.txt', $new_file); 

如果你想編輯該行,使用preg_match推編輯的行到新陣列。

如果你想刪除那一行,什麼都不做。直接無視(好了。

如果要切換到下一行,請將當前行按到新陣列。

最後保存new array到文件。

+0

謝謝,它正是我想要的;) – Marcin

2

的基本過程是:

open main file in readonly mode 
open secondary (temp) file in writeonly mode 
Loop: readline from main file 
    process the line 
    save to secondary file 
until end of file 
close both files 
delete the main file 
rename the secondary file.