Как удалить строку из файла с помощью PHP?

у меня есть файл с именем $dir и строка с именем $line, Я знаю, что эта строка полная строка из файла, но я не знаю его номер строки и я хочу, чтобы удалить его из файла, что делать?

можно ли использовать awk?

8 ответов


$contents = file_get_contents($dir);
$contents = str_replace($line, '', $contents);
file_put_contents($dir, $contents);

прочитайте строки одну за другой и запишите все, кроме соответствующей строки, в другой файл. Затем замените исходный файл.


это будет просто просматривать каждую строку, и если это не то, что вы хотите удалить, он будет отправлен в массив, который будет записан обратно в файл. посмотреть этот

 $DELETE = "the_line_you_want_to_delete";

 $data = file("./foo.txt");

 $out = array();

 foreach($data as $line) {
     if(trim($line) != $DELETE) {
         $out[] = $line;
     }
 }

 $fp = fopen("./foo.txt", "w+");
 flock($fp, LOCK_EX);
 foreach($out as $line) {
     fwrite($fp, $line);
 }
 flock($fp, LOCK_UN);
 fclose($fp);  

другой подход-читать файл строка за строкой, пока не найдете совпадение, затем усечь файл до этой точки, а затем добавить остальные строки.


это также хорошо, если вы ищете подстроку (ID) в строке и хотите заменить старую строку новой строкой.

код:

$contents = file_get_contents($dir);
$new_contents= "";
if( strpos($contents, $id) !== false) { // if file contains ID
    $contents_array = preg_split("/\r\n|\r|\n/", $contents);
    foreach ($contents_array as &$record) {    // for each line
        if (strpos($record, $id) !== false) { // if we have found the correct line
            pass; // we've found the line to delete - so don't add it to the new contents.
        }else{
            $new_contents .= $record . "\r"; // not the correct line, so we keep it
        }
    }
    file_put_contents($dir, $new_contents); // save the records to the file
    echo json_encode("Successfully updated record!");
}
else{
    echo json_encode("failed - user ID ". $id ." doesn't exist!");
}

пример:

вход: "123,студент"

файл:

ID, профессия

123,студента

124, слой кирпича

запуск кода изменит файл кому:

новый файл:

ID, профессия

124, слой кирпича


Это можно решить без использования awk:

function remove_line($file, $remove) {
    $lines = file($file, FILE_IGNORE_NEW_LINES);
    foreach($lines as $key => $line) {
        if($line === $remove) unset($lines[$key]);
    }
    $data = implode(PHP_EOL, $lines);
    file_put_contents($file, $data);
}

такой:

file_put_contents($filename, str_replace($line . "\r\n", "", file_get_contents($filename)));

Я думаю, что лучший способ работы с файлами-редактировать их как строки.

во-первых, получить все строки файла (следующие коды могут быть сжаты):

$file = @fopen($dir, 'r'); # As you said, $dir is your filename
if ($file) { # Ending bracket is at the end
    if (filesize($dir)) { # Checks whether the file size is not zero (we know file exists)
        $fileContent = fread($file, filesize($dir)); # Reads all of the file
        fclose($file);
    } else {
        // File is empty
        exit; # Stops the execution (also you can throw an exception)
    }
    $fileLineByLine = explode(PHP_EOL, $fileContent); # Divides the file line by line

здесь вы можете выполнить поиск:

    $key = false; # By default, your string $line is not in the file (false)
    foreach ($fileLineByLine as $lineNumber => $thisLine)
        if ($thisLine === $line)
            $key = $lineNumber; # If $line found in file, set $key to this line number

просто, вы можете удалить строку $key + 1:

    if ($key !== false) # If string $line found in the file
        unset($fileLineByLine[$key]); # Remove line $key + 1 (e.g. $key = 2, line 3)

наконец, вы должны сохранить изменения в файл:

    $newFileContent = implode(PHP_EOL, $fileLineByLine); # Joins the lines together
    $file = fopen($dir, "w"); # Clears the file
    if ($file) {
        fwrite($file, $newFileContent); # Saves new content
        fclose($file);
    }
} # Ends 'if ($file) {' above

также вы можете установить выше код в качестве функции.

Примечания:

  • $строка не должна иметь новых символов строки, таких как \n. Вы должны удалить их:

    $line = str_replace(PHP_EOL, '', $line);
    
  • Не используйте

    $fileLineByLine[$key] = "";
    

    вместо

    unset($fileLineByLine[$key]);
    

    потому что первый случай не удаляет строку, он просто очищает строку (и нежелательная пустая строка останется). В этом случае implode () добавляет новую строку также для $fileLineByLine[$key], которая пуста; в противном случае, если вы отключите переменную, она будет недоступна (и implode () не может найти его).