fgetss()
Функция fgetss() в PHP читает строку из файла и удаляет HTML и PHP-теги. Устарела в PHP 7.3, удалена в PHP 8.0.
Что такое функция fgetss()?
Важно:
fgetss()была устаревшей в PHP 7.3 и удалена в PHP 8.0. На любой современной версии PHP она вызовет фатальную ошибку (Call to undefined function fgetss()). На этой странице описано, что она делала, и показана поддерживаемая замена —fgets()в сочетании сstrip_tags()— чтобы вы могли читать и переносить устаревший код.
Функция fgetss() (сокращение от «file get string, strip») читала одну строку из открытого файла и удаляла из неё все HTML- и PHP-теги перед возвратом. Она работала точно так же, как fgets() — читая до символа новой строки, до указанной длины или до конца файла — с одним дополнительным шагом: теги удалялись на выходе.
По сути это было сокращение для strip_tags(fgets($handle)), именно поэтому PHP от неё отказался: тот же результат достигается очевидной комбинацией двух хорошо понятных функций, поэтому отдельная функция почти не добавляла ценности и была легко подвержена злоупотреблениям в плане безопасности.
Вот синтаксис, который она использовала:
Синтаксис PHP функции fgetss()
fgetss(resource $handle, int $length = ?, string $allowable_tags = ?): string|false| Параметр | Описание |
|---|---|
handle | Указатель на файл, возвращённый функцией fopen(). Обязательный. |
length | Необязательный. Максимальное количество байт для чтения. Чтение останавливается при достижении этой длины, символа новой строки или EOF — в зависимости от того, что наступит первым. Опустите, чтобы читать всю строку. |
allowable_tags | Необязательный. Строка тегов, которые не должны удаляться, например "<b><i>". |
Возвращаемое значение: следующая строка с удалёнными тегами или false, когда достигнут конец файла или произошла ошибка.
Распространённой ошибкой было предположение, что
fgetss()безопасно санирует входные данные. Она только удаляла теги с помощью простого парсера — она никогда не нейтрализовала атрибуты, такие какonclick=или URL видаjavascript:. Для настоящего экранирования вывода используйтеhtmlspecialchars(), а не удаление тегов.
Как читать файл и удалять теги в PHP?
Использование функции fgetss() было похоже на использование функции fgets(). Вот шаги, которые нужно выполнить:
- Откройте файл с помощью функции
fopen(). - Используйте функцию
fgets()для чтения строки из файла, затем применитеstrip_tags()для удаления тегов. - Закройте файл с помощью функции
fclose().
Вот полный самодостаточный пример. Он записывает небольшой HTML-файл, затем читает его построчно с помощью fgets(), удаляя теги из каждой строки:
Как использовать fgets() и strip_tags()?
<?php
// Create a sample file containing HTML so the example runs on its own
file_put_contents("demo.txt", "<h1>Hello</h1>\n<p>World</p>\n");
$file = fopen("demo.txt", "r");
// Loop until fgets() returns false (end of file)
while (($line = fgets($file)) !== false) {
// Remove HTML/PHP tags from the line before printing
echo strip_tags($line);
}
fclose($file);Вывод:
Hello
WorldНесколько замечаний об этом подходе:
- Проверяйте возвращаемое значение, а не
feof(). Чтение с помощьюwhile (($line = fgets($file)) !== false)надёжнее, чемwhile (!feof($file)), потому чтоfeof()становитсяtrueтолько после неудачного чтения — старый цикл может обработать пустое финальное чтение. Использование строгого сравнения!== falseтакже позволяет избежать интерпретации допустимой строки типа"0"как конца файла. - Сохраняйте некоторые теги.
fgetss()принимала аргументallowable_tags;strip_tags()тоже его принимает, поэтому миграция прямолинейна:strip_tags($line, "<b><i>")сохраняет<b>и<i>, удаляя всё остальное. - Удаление тегов — не санирование. Если вы отображаете ненадёжное содержимое файла в браузере, экранируйте его с помощью
htmlspecialchars()вместо (или в дополнение к) удаления тегов.
Завершив чтение, всегда освобождайте дескриптор с помощью fclose().
Заключение
Функция fgetss() устарела: она была помечена устаревшей в PHP 7.3 и удалена в PHP 8.0, поэтому её нельзя использовать в новом коде. Чтобы читать файл построчно с удалением HTML или PHP-тегов, комбинируйте fgets() с strip_tags() — передавайте аргумент allowable_tags, если нужно сохранить определённые теги. Для настоящей безопасности вывода используйте htmlspecialchars(). Для более глубокого изучения файлового ввода-вывода см. fopen(), feof() и fclose().