逐行编辑文件

时间:2016-01-14 21:02:55

标签: php

我正在制作一个逐行读取文件的程序并删除说Hand #[any numbers]

的行
$file_name = 'the_file.txt';
$file_handle = fopen($file_name,"r+");

while(! feof($file_handle)) {
    $file = fgets($file_handle);

    if (preg_match("/^(Hand\s#\d+)/m", $file)) {
        fwrite($file_handle, preg_replace("/^(Hand\s#\d+)/m", "", $file));
    }

  }

fclose($file_handle);

此代码不执行任何操作,但是如果放echo $file . '<br />';它会打印Hand #[any numbers]的每一行所以认为它是fwrite($file_handle, preg_replace("/^(Hand\s#\d+)/m", "", $file));的问题如果文件没有逐行读取,那么它可以正常工作

3 个答案:

答案 0 :(得分:1)

尝试写入与您正在阅读的文件不同的文件。 PHP可能不会因为您正在尝试覆盖文件的某些部分而感到不适。

同时仔细检查PHP脚本是否有权写入文件。尝试一些简单的事情,例如备份它,然后执行file_put_contents($file_name, 'test');

答案 1 :(得分:0)

它可能与文件指针位置有关,也与您正在写入文件而不删除任何内容有关。请参阅函数http://us.php.net/manual/en/function.fseek.php

所以你不是删除一行,而是在你刚读完的那一行之后的地方写一个新行(留在原处)。在这种情况下,最好在不同的文件中写入。

答案 2 :(得分:0)

您想要排除以“Hands #number”开头的所有行吗? 那你为什么要使用preg_match来找到这些行,把它们写成什么代替文件呢?只需排除它们并在数组中保留所需的行。或者打开辅助文件并将每行直接写入新文件,如果内存限制是个问题。

$filename = "the_file.txt";
$handle = fopen($filename, "r+") or die("Could not open $filename" . PHP_EOL);

$keep = array();
while(!feof($handle)) {
    $line = fgets($handle);
    if(!preg_match("/^(Hand\s#\d+)/m", $line)) {
        $keep[] = $line;
    }
}
rewind($handle);
fwrite($handle, implode(PHP_EOL, $keep));
fclose($handle);