Hello Stack overflow目前我有这个问题
1105904#(NAME)被禁止0天Unbandate = 2014-01-02 by(Glenn)Banned @ 2014-01-02
当日期是2014-01-02时,它应该删除我尝试使用此代码的整行
$time = date("Y-m-d");
$arr = file('ban_list.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$to_remove = $time;
$arr = array_filter($arr, function($item) use ($to_remove) {
return $item != $to_remove;
});
file_put_contents('ban_list.txt', join("\n", $arr));
它似乎没有删除任何东西
请帮帮我 问候格伦
答案 0 :(得分:1)
您检查整行是否等于$ time。制作正则表达式或使用strpos进行检查。但请确保您不删除该行,因为创建日期是当前日期。
以下作品例如
array_filter($arr, function($item) use ($to_remove) {
return !preg_match("/$to_remove by /", $item);
});
整个剧本:
$time = date("Y-m-d");
$arr = file('ban_list.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$to_remove = $time;
$arr = array_filter($arr, function($item) use ($to_remove) {
return !preg_match("/$to_remove by /", $item);
});
file_put_contents('ban_list.txt', join("\n", $arr));
答案 1 :(得分:0)
使用Linux机箱试试这个:
exec("sed -i '/Unbandate = " . date('Y-m-d') . "/d' ban_list.txt");
修改强>
更便携的“Windows友好”方式是:
if ($handle = fopen("ban_list.txt", "c+")) {
$write_position = ftell($handle);
while (($line = fgets($handle, 4096)) !== FALSE) {
$read_position = ftell($handle);
if (strpos($line, "Unbandate = " . date('Y-m-d')) === FALSE) {
fseek($handle, $write_position, SEEK_SET);
fputs($handle, $line);
$write_position = ftell($handle);
fseek($handle, $read_position, SEEK_SET);
}
}
ftruncate($handle, $write_position);
fclose($handle);
}
因此,使用此代码不需要创建第二个文件,也不需要将整个文件放在内存中。但在现实世界中,内存消耗总是一个问题,我仍然更喜欢我的第一个解决方案,或某种 Windows variant ,类似这样(未经测试)的代码:
exec("cat ban_list.txt | where { $_ -notmatch 'Unbandate = " . date('Y-m-d') . "' } > ban_list.txt");