Fgetss: примеры (PHP)

Работа с функцией fgetss в языке PHP
Раздел: Работа с файлами
fgetss(resource $handle, int $length = ?, string $allowable_tags = ?): string
Функция fgetss в PHP

Функция fgetss является устаревшей функцией языка PHP, предназначенной для чтения строки из файла с одновременным удалением HTML и PHP тегов. Изначально она использовалась для безопасной обработки данных, полученных из внешних источников, таких как файлы или потоки.

Аргументы функции

Функция принимала три параметра:

  1. handle - обязательный ресурс (указатель) файла, полученный через fopen().
  2. length - необязательный целочисленный аргумент, задающий максимальную длину считываемой строки.
  3. allowable_tags - необязательный строковый параметр, позволяющий указать теги, которые не должны удаляться.

Функция возвращала строку длиной до length - 1 байт с удаленными тегами или false при ошибке или достижении конца файла.

Простые примеры использования
Базовое применение
$file = fopen('test.html', 'r');
echo fgetss($file);
fclose($file);
Пример текста без тегов
С указанием длины
$file = fopen('test.html', 'r');
echo fgetss($file, 50);
fclose($file);
Фрагмент строки длиной до 49 байт
С разрешенными тегами
$file = fopen('test.html', 'r');
echo fgetss($file, 1024, '<strong><em>');
fclose($file);
Текст с сохраненными тегами <strong> и <em>
Похожие функции в PHP

В современных версиях PHP вместо fgetss рекомендуется использовать другие функции:

  • strip_tags() - удаляет HTML и PHP теги из строки. Более универсальна, работает с любыми строками.
  • fgets() с последующим применением strip_tags() - для чтения файлов построчно.
  • htmlspecialchars() - преобразует специальные символы в HTML сущности, что предотвращает выполнение тегов.
  • DOMDocument с фильтрацией - для сложного парсинга HTML.

Для новых проектов предпочтительнее использовать strip_tags() или htmlspecialchars() в зависимости от задачи.

Аналоги в других языках

Fgetss в Python

from bs4 import BeautifulSoup
import re

with open('test.html', 'r') as file:
    text = file.readline()
    clean_text = BeautifulSoup(text, 'html.parser').get_text()
    # Или с помощью re
    clean_text = re.sub(r'<[^>]*>', '', text)
Текст без HTML разметки

Fgetss в Javascript

// В браузере
let text = '<p>Пример</p>';
let cleanText = text.replace(/<[^>]*>/g, '');

// В Node.js с fs
const fs = require('fs');
let fileContent = fs.readFileSync('test.html', 'utf8');
let lines = fileContent.split('\n');
let cleanLine = lines[0].replace(/<[^>]*>/g, '');
Пример

Fgetss в MySQL

-- Нет прямой аналогии, но можно использовать функции для удаления тегов
-- через пользовательские функции или обработку на стороне приложения.
Типичные ошибки
Использование несуществующей функции в PHP 8+
$file = fopen('test.txt', 'r');
$line = fgetss($file); // Фатальная ошибка
fclose($file);
Fatal error: Uncaught Error: Call to undefined function fgetss()
Некорректный указатель файла
$line = fgetss(false); // Предупреждение в старых версиях PHP
Warning: fgetss() expects parameter 1 to be resource, boolean given
Игнорирование кодировки
// Файл в UTF-8 с кириллицей
$file = fopen('file.html', 'r');
echo fgetss($file); // Могут возникнуть проблемы с многобайтовыми символами
fclose($file);
Часть строки может обрезаться некорректно
Изменения в версиях PHP

Функция fgetss претерпела несколько изменений:

  • В PHP 7.3 функция была объявлена устаревшей (deprecated).
  • В PHP 8.0 функция была полностью удалена из ядра языка.
  • В ранних версиях PHP функция имела проблемы с безопасностью и некорректно обрабатывала некоторые типы тегов.

Разработчикам рекомендуется перейти на использование strip_tags() или других современных методов фильтрации.

Расширенные примеры
Обработка всего файла
Пример php
$file = fopen('data.html', 'r');
while (!feof($file)) {
    echo fgetss($file, 4096, '<a><img>');
}
fclose($file);
Весь текст файла с сохранением только тегов <a> и <img>
Фильтрация с учетом атрибутов
Пример php
// fgetss не сохраняла атрибуты даже разрешенных тегов
$file = fopen('test.html', 'r');
echo fgetss($file, 1024, '<a href>'); // href не сохранится
fclose($file);
Ссылка будет без атрибута href
Работа с потоками
Пример php
$stream = fopen('php://input', 'r');
$clean_input = fgetss($stream); // Чтение и очистка входящих данных
Очищенная строка из стандартного ввода
Эмуляция fgetss с strip_tags
Пример php
function modern_fgetss($handle, $length = null, $allowable_tags = '') {
    $line = $length ? fgets($handle, $length) : fgets($handle);
    return $line !== false ? strip_tags($line, $allowable_tags) : false;
}

$file = fopen('test.html', 'r');
echo modern_fgetss($file, 512, '<b>');
fclose($file);
Текст с сохраненными тегами <b>

PHP fgetss function comments

En
Fgetss Gets line from file pointer and strip HTML tags