Php удалить строку из файла

Обновлено: 20.11.2024

Добро пожаловать в краткое руководство по удалению разрывов строк в PHP. Нужно избавиться от всех разрывов строк в строке? Убрать лишние?

  1. $nobreak = str_replace(["\r", "\n"], "", $STRING);
  2. $nobreak = preg_replace("/\r|\n/", "", $STRING);
  3. $nobreak = обрезать($STRING);

Это должно охватывать основы, но читайте другие примеры!

ⓘ Я включил zip-файл со всем исходным кодом в начале этого руководства, поэтому вам не нужно копировать и вставлять все… Или если вы просто хотите сразу погрузиться.

БЫСТРЫЕ СЛАЙДЫ

СОДЕРЖАНИЕ

СКАЧАТЬ И ПРИМЕЧАНИЯ

Во-первых, вот ссылка для загрузки примера кода, как и было обещано.

БЫСТРЫЕ ЗАМЕЧАНИЯ

Если вы заметили ошибку, не стесняйтесь комментировать ниже. Я тоже стараюсь отвечать на короткие вопросы, но это один человек против всего мира... Если вам срочно нужны ответы, посмотрите мой список веб-сайтов, чтобы получить помощь по программированию.

СКАЧАТЬ ПРИМЕР КОДА

Нажмите здесь, чтобы загрузить весь исходный код примера. Я выпустил его под лицензией MIT, так что не стесняйтесь строить на его основе или использовать в своем собственном проекте.

УДАЛИТЬ РАЗРЫВЫ СТРОК

Хорошо, теперь давайте рассмотрим способы удаления разрывов строк в PHP.

СПОСОБ 1) ЗАМЕНА СТРОКИ

Возможно, это один из самых простых и быстрых способов. Просто замените все разрывы строк ( \r и \n ) пустой строкой, эффективно удалив их все.

МЕТОД 2) РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ

Далее у нас есть то, что называется «регулярным выражением». Проще говоря, регулярные выражения позволяют нам вводить собственные термины сопоставления и замены, и это может быть чрезвычайно сложно. Поэтому я просто оставлю это здесь — /\r|\n/ — это регулярное выражение, которое соответствует всем разрывам строк.

СПОСОБ 3) ОБРЕЗАТЬ

Чтобы удалить только начальные и конечные разрывы строк, используйте функцию trim(). Да, обратите внимание, trim() оставляет все разрывы строк между ними как есть.

СПОСОБ 4) УДАЛИТЬ РАЗРЫВЫ СТРОК HTML

Наконец, все должно быть понятно. Чтобы удалить разрывы строк HTML (
или
), мы делаем ту же самую старую команду «заменить все

».

с пустой строкой».

ПОЛЕЗНЫЕ ИНФОРМАЦИИ И ССЫЛКИ

Это все, что касается руководства, и вот небольшой раздел с дополнительными материалами и ссылками, которые могут быть вам полезны.

ССЫЛКИ И ССЫЛКИ

ИНФОГРАФИЧЕСКАЯ Шпаргалка

КОНЕЦ

Спасибо, что прочитали, и мы подошли к концу. Я надеюсь, что это помогло вам лучше понять, и если вы хотите поделиться чем-либо с этим руководством, пожалуйста, не стесняйтесь комментировать ниже. Удачи и удачного кодирования!

Оставить комментарий Отменить ответ

Поиск

сообщить об этом объявлении

Прорыв в Javascript

Сфотографировать с помощью веб-камеры? Голосовые команды? Видеозвонки? Да, это возможно с помощью Javascript — ознакомьтесь с прорывом Javascript!

сообщить об этом объявлении

Я пытаюсь полностью автоматизировать свой веб-сайт и пытаюсь удалить из файла строку, совпадающую со строкой в ​​заданной строке.
Например, у меня есть текстовый файл с именем toApprove.txt, содержащий список таких имен, как:

Файл сохраняется в этом формате. Итак, если у меня есть переменная, содержащая «Джо», как мне удалить строку с надписью «Джо» из текстового файла и сохранить остальные. вот что я пробовал ($_GET["file"] представляет собой строку, которую я хочу удалить):

Большое спасибо за помощь!

  • 4 участника
  • 7 ответов
  • Просмотры 4K
  • Двухлетний период обсуждения
  • Последнее сообщение 11 лет назад Последнее сообщение от mschroeder

Рекомендуемые ответы

Вы получаете сообщение об ошибке? Я не вижу особых проблем в коде.

Обычно вы хотите, чтобы база данных выполняла эту работу за вас. Это намного проще, чем чтение/запись из файлов.

Например, с БД это так же просто, как:

Спасибо за помощь! У меня нет базы данных для использования (я использую бесплатный веб-хостинг).
Кроме того, я не получаю никаких сообщений об ошибках. Вместо этого он просто ничего не удаляет из файла. Однако я попробую функцию file_put_contents. Спасибо!

Да, обычно проще просто поставить…

Все 7 ответов

Вы получаете сообщение об ошибке? Я не вижу особых проблем в коде.

Обычно вы хотели бы, чтобы база данных выполняла эту работу за вас. Это намного проще, чем чтение/запись из файлов.

Например, с БД это так же просто, как:

Затем база данных делает в основном то же, что и вы с файлами на диске или в памяти, в зависимости от используемого типа хранилища. Базы данных очень эффективны в этом, хотя по своей конструкции.

Ваш код очень удобен для обновления файлов, поскольку он очень эффективно использует память. Если вы работаете с небольшими файлами, вы можете сэкономить время, выполнив следующее:

Это намного проще, однако требует много памяти, если у вас большой файл, так как вы будете сохранять все содержимое файла в переменную $txt (память PHP).
file_get_contents() должна быть более эффективной, чем использование fopen() и fgets() для файлов меньшего размера... это, безусловно, более удобно.

file_put_contents() поддерживается только в PHP5, поэтому вы можете протестировать его и свою систему и создать функцию, если она не существует:

(PHP 4, PHP 5, PHP 7, PHP 8)

file — считывает весь файл в массив

Описание

Считывает весь файл в массив.

Примечание.

Вы можете использовать file_get_contents() для возврата содержимого файла в виде строки.

Параметры

Путь к файлу.

URL-адрес можно использовать в качестве имени файла с этой функцией, если включена оболочка fopen. См. fopen() для более подробной информации о том, как указать имя файла. См. Поддерживаемые протоколы и оболочки для получения ссылок на информацию о возможностях различных оболочек, заметок об их использовании и информации о любых предопределенных переменных, которые они могут предоставлять.

Необязательные флаги параметров могут быть одной или несколькими из следующих констант: FILE_USE_INCLUDE_PATH Поиск файла в include_path. FILE_IGNORE_NEW_LINES Пропускать новую строку в конце каждого элемента массива FILE_SKIP_EMPTY_LINES Пропускать пустые строки

Возвращаемые значения

Возвращает файл в виде массива. Каждый элемент массива соответствует строке в файле с прикрепленным символом новой строки. При ошибке file() возвращает false .

Примечание.

Каждая строка результирующего массива будет включать окончание строки, если только не используется FILE_IGNORE_NEW_LINES.

Примечание. Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение параметра конфигурации во время выполнения auto_detect_line_endings может помочь решить проблему.

Ошибки/Исключения

Выдает ошибку уровня E_WARNING, если файл не существует.

Примеры

// Используя необязательный параметр флагов
$trimmed = file ('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>

Примечания

См. также

  • file_get_contents() — считывает весь файл в строку
  • readfile() — выводит файл
  • fopen() — открывает файл или URL-адрес
  • fsockopen() – открыть подключение к Интернету или доменному сокету Unix.
  • popen() — открывает указатель файла процесса
  • включить – включить
  • stream_context_create() — создает контекст потока.

Примечания, внесенные пользователями 15 примечаний

Если файл, который вы читаете, имеет формат CSV, не используйте file(), используйте fgetcsv(). file() будет разделять файл по каждой новой строке, которую он найдет, даже новой строке, которая появляется в поле (т.е. в кавычках).

это может быть очевидным, но мне потребовалось некоторое время, чтобы понять, что я делаю неправильно. Поэтому я хотел поделиться. У меня есть файл на моем диске "c:\". Как мне файл() это?

Не забывайте, что обратная косая черта является специальной, и вы должны «экранировать» обратную косую черту, т. е. «\\»:

= файл ("C:\\Documents and Settings\\myfile.txt");

foreach($lines as $line)
echo( $line);
>

надеюсь, это поможет.

Чтобы записать все строки файла, другими словами, прочитать файл построчно, вы можете написать такой код:
= file ( 'name.txt' );
// Чтобы проверить количество строк
echo count ( $names ). '
' ;
foreach( $names as $name )
echo $name . '
' ;
>
?>

этот пример настолько прост, что можно понять, как он работает. Надеюсь, это поможет многим новичкам.

читать из CSV-данных (файла) в массив с именованными ключами

<р>. с или без 1-й строки = заголовок (ключи)
(см. 4-й параметр вызова функции как true/false)

функция csv_in_array ($url, $delm = ";", $encl = "\"", $head = false)

$csvxrow = файл ( $url ); // ---- строки csv в массив ----

$csvxrow [ 0 ] = отбивная ( $ csvxrow [ 0 ]);
$csvxrow [0] = str_replace ($encl, '', $csvxrow [0]);
$keydata = взорвать ( $delm , $csvxrow [ 0 ]);
$keynumb = количество ($keydata);

if ($head === true) <
$anzdata = count ($csvxrow);
$z = 0 ;
for( $x = 1 ; $x $anzdata ; $x ++) <
$csvxrow [ $x ] = Chop ( $csvxrow [ $x ]);
$csvxrow [$x] = str_replace ($encl, '', $csvxrow [$x]);
$csv_data [$x] = взорвать ($delm, $csvxrow [$x]);
$i = 0 ;
foreach( $keydata as $key ) <
$out [ $z ][ $key ] = $csv_data [ $x ][ $i ];
$i++;
>
$z++;
>
>
else <
$i = 0 ;
foreach( $csvxrow as $item ) <
$item = отбивная ( $item );
$item = str_replace ($encl, '', $item);
$csv_data = взорвать ($delm, $item);
for ( $y = 0 ; $y $keynumb ; $y ++) <
$out [ $i ][ $y ] = $csv_data [ $y ];
>
$i++;
>
>

?>

вызов функции с 4 параметрами:

(1) = файл с данными CSV (url / строка)
(2) = разделитель столбцов (например: ; или | или , . )
(3) = значения, заключенные в (например, : ' или " или ^ или . )
(4) = с 1-й строкой или без нее = голова (истина/ложь)

Имейте в виду, что использование file() для подсчета строк может привести к OOM на сервере, поскольку все строки будут размещены в массиве.

Если вы имеете дело с файлами, которые могут содержать тысячи строк, лучше использовать SplFileObject, и с небольшими изменениями вы можете получить тот же результат.

Начиная с PHP 5.6 функции file(), file_get_contents() и fopen() будут возвращать false, если вы ссылаетесь на исходный URL-адрес, не имеющий действительного сертификата SSL. Предположительно, вы будете часто сталкиваться с этим в своих средах разработки, это сведет вас с ума.

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

$args = array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false),"http"=>array('timeout' => 60, 'user_agent' => ' Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1'));

(«Проблема file() с UTF-16» неверна. Это обновлено.
Первый может пропустить последнюю строку строки.)

file(), похоже, имеет проблемы с обработкой
UTF-16 с BOM или без него.

file() скорее всего будет считать "\n"=LF (0A) окончанием строки.
Таким образом, не только "000A", но и "010A, 020A. FE0A, FF0A."
рассматриваются как окончание строки.

Более того, file() вызывает серьезную проблему в UTF-16LE.
file() теряет первый "0A" (первую половину "0A00")!
А следующая строка начинается с " 00" (остальная часть "0A00").
Поэтому строки после первого "0A" совершенно разные.

Чтобы избежать этого явления,
например. в случае (php_script: UTF-8, файл: UTF-16 с окончанием строки "\r\n"),

('UTF-16'); // для правильной работы mb_ereg_..()
$str = file_get_contents ( $file_path );
$to_encoding = 'UTF-16' ; // кодировка строки
$from_encoding = 'UTF-8' ; // кодировка PHP_script
$pattern1 = mb_convert_encoding ('[^\r]*\r\n', $to_encoding, $from_encoding);
mb_ereg_search_init ( $str , $pattern1 );
в то время как ( $res = mb_ereg_search_regs ()) $file [] = $res [ 0 ];
>
$pattern2 = mb_convert_encoding ('\A.*\r\n(.*)\z', $to_encoding, $from_encoding);
mb_ereg ($pattern2, $str, $match);
$file[] = $match[1];

?>

вместо
$file = file($file_path);

Если конец строки равен "\n",
$pattern1 = mb_convert_encoding('[^\n]*\n', $to_encoding, $from_encoding);

Использования if ( file(name.txt) ) может быть недостаточно для проверки того, был ли файл успешно открыт для чтения, потому что файл может быть пустым, и в этом случае возвращаемый массив будет пустым, поэтому вместо этого проверьте с помощью !==. например:

$file_array = файл('test.txt'); // пустой файл

Вот мой конвертер CSV
поддерживает заголовки и обрезает все поля
Примечание: заголовки не должны быть пустыми!

функция csv2array ($file, $delim = ';', $encl = '"', $header = false)

Пользователь предложил всегда использовать rtrim из-за конфликта окончания строки с файлами, у которых EOL отличается от EOL сервера.

Использование rtrim с заменой символов по умолчанию — плохое решение, так как оно удаляет все пробелы в дополнение к символам '\r' и '\n'.

Хорошее решение с использованием rtrim:

= rtrim ( $line , "\r\n" ) . PHP_EOL;
?>

Это удаляет только символы EOL и заменяет их символом EOL сервера, что позволяет preg_* нормально работать при сопоставлении EOL ($)

Примечание. Теперь, когда file() является двоично-безопасным, он "намного" медленнее, чем раньше. Если вы планируете читать большие файлы, возможно, стоит использовать fgets() вместо file(). Например:

= fopen("log_file.txt", "r");
while (! feof ( $fd ))
<
$buffer = fgets ( $fd , 4096 );
$lines [] = $buffer ;
>
fclose ( $fd );
?>

Результирующий массив $lines.

Я проверил файл из 200 000 строк.Для fgets() это заняло секунды, а для file() — минуты.

Это примечание относится к PHP 5.1.6 под Windows (хотя может относиться и к другим версиям).

Похоже, что флаг FILE_IGNORE_NEW_LINES не удаляет новые строки должным образом при чтении текстовых файлов в стиле Windows, т. е. файлов, строки которых заканчиваются на '\r\n'.

Решение. Всегда используйте rtrim() вместо FILE_IGNORE_NEW_LINES.

Использование file() для чтения больших текстовых файлов размером > 10 МБ создает проблемы, поэтому вам следует использовать его вместо этого. Это намного медленнее, но работает нормально. $lines вернет массив со всеми строками.

= @ fopen('yourfile.', "r");
if ($handle) <
while (! feof ($handle)) <
$lines [] = fgets ($handle, 4096);
>
fclose ($handle);
>
?>

Удаляет имя файла . Подобно функции Unix C unlink(). В случае сбоя будет сгенерирована ошибка уровня E_WARNING.

Параметры

Путь к файлу.

Если файл является символической ссылкой, символическая ссылка будет удалена. В Windows для удаления символической ссылки на каталог необходимо использовать rmdir().

Возвращаемые значения

Возвращает true в случае успеха или false в случае неудачи.

Журнал изменений

Версия Описание
7.3.0 Вкл. Windows, теперь можно unlink() файлы с используемыми дескрипторами, хотя раньше это не удавалось. Однако по-прежнему невозможно воссоздать несвязанный файл, пока все его дескрипторы не будут закрыты.

Примеры

См. также

Пользовательские заметки 11 заметок

Это приведет к удалению всех файлов в каталоге, соответствующих шаблону в одной строке кода.

('unlink', glob("some/dir/*.txt" )); ?>

Удалили большой файл, но не видите увеличения свободного места или уменьшения использования диска? Используете UNIX или другую ОС POSIX?

Unlink() предназначена не для удаления файла, а для удаления имени файла. В справочной странице сказано: ``unlink - удалить имя и, возможно, файл, на который оно ссылается''.

Большую часть времени файл имеет только одно имя — его удаление также удалит (освободит, освободит) «тело» файла (с одной оговоркой, см. ниже). Это простой, обычный случай.

Однако файл может иметь несколько имен (см. функцию link()) в одном или разных каталогах. Все имена будут ссылаться на тело файла и, так сказать, "поддерживать его жизнь". Только после удаления всех имен тело файла фактически освобождается.

Предупреждение:
Тело файла может *также* быть `поддержано живым' (все еще использующим дисковое пространство) процессом, удерживающим файл открытым. Тело не будет освобождено (не освободит место на диске), пока процесс держит его открытым. На самом деле, есть причудливый способ воскресить файл, удаленный по ошибке, но все еще открытый процессом.

отключить($fileName); у меня не получилось.
Затем я попытался использовать функцию realpath($fileName) как
unlink(realpath($fileName)); это сработало

просто опубликую на случай, если кому-то это покажется полезным.

Вот самый простой способ удалить файлы с маской

= "*.jpg"
array_map ("unlink", glob ($mask));
?>

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

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

Наконец-то я понял, что не так: поскольку я работал с файлом и еще не закрыл его, он все еще использовался и, конечно же, не мог быть удален :)

Поэтому я решил упомянуть об этом здесь, чтобы другие не совершали ту же ошибку:

// Сначала закрываем файл
fclose ( $fp );

// Затем отвязать :)
отключить ( $somefile );
?>

Чтобы удалить все файлы с определенным расширением или фактически удалить все с подстановочным знаком, гораздо проще использовать функцию glob. Скажем, я хотел удалить все jpg .

foreach ( glob ("*.jpg" ) as $filename ) echo " Размер $filename " . размер файла ($имя_файла). "\п" ;
отключить ( $filename );
>

Это может показаться очевидным, но я рвал на себе волосы из-за этой проблемы — убедитесь, что файл, который вы пытаетесь удалить, в настоящее время не используется. У меня был скрипт, который анализировал текстовый файл и должен был удалить его после завершения, но продолжал получать ошибку отказа в разрешении, потому что я явно не закрыл файл, следовательно, технически он все еще «использовался», хотя анализ был завершено.

Для тех, у кого была проблема с ошибкой отказа в правах, она иногда возникает, когда вы пытаетесь удалить файл, который находится в папке выше в иерархии, в ваш рабочий каталог (например, при попытке удалить путь, начинающийся с ". ./").

Поэтому, чтобы обойти эту проблему, вы можете использовать chdir(), чтобы изменить рабочий каталог на папку, в которой находится файл, связь с которым вы хотите отменить.

= getcwd(); // Сохраняем текущий каталог
chdir ( $path_to_file );
отключить ( $filename );
chdir ( $old ); // Восстановить старый рабочий каталог
?>

В OSX при борьбе с ошибкой «Отказано в доступе» убедитесь, что у каталога есть разрешения на запись для исполняющего пользователя php.

Кроме того, если вы полагаетесь на списки управления доступом и хотите удалить файл или символическую ссылку, у содержащего каталога должно быть разрешение «delete_child», чтобы отменить связь между вещами внутри. Если вы предоставите «удалить» только папке, это позволит вам удалить саму папку-контейнер, но не объекты внутри.

unlink работает так же, как команда rm в nix на основе потерь или команда del в Windows, она не разрешает файл, а удаляет точный указанный путь, даже если этот путь является просто ссылкой.

EG
/var/www/test/index.php = symlink(/home/test/www/index.php)
( "/var/www/test/index.php" ) ;
?>
Будет удалена только ссылка, а не исходный файл, где как
( "/home/test/www/index.php" );
?>
Отключит исходный путь к файлу и разорвет символическую ссылку, а также позволит перезаписать систему, поскольку файловая система больше не будет знать о местоположении файла.

Лучший способ удалить файлы по маске:
( glob ( '/etc/*' ), 'unlink' );
?>
Не используйте array_map, упомянутый ниже, - его цель - обработать значения в заданном массиве И СОБИРАТЬ данные, возвращаемые функцией обратного вызова. Таким образом, array_map работает медленнее и использует дополнительную память по сравнению с array_walk.

Читайте также: