如何从文本文件中删除完整的行

时间:2014-01-02 17:43:02

标签: php

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

它似乎没有删除任何东西

请帮帮我 问候格伦

2 个答案:

答案 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");