Gzgetss: примеры (PHP)
gzgetss(resource $zp, int $length, string $allowable_tags = ?): stringФункция gzgetss была предназначена для чтения строки из gz-файла с одновременным удалением HTML и PHP тегов. Она использовалась для обработки сжатых лог-файлов, конфигурационных данных или других текстовых ресурсов, где требовалась фильтрация разметки.
Функция принимала три параметра:
- zp - Указатель на gz-файл, успешно открытый с помощью функции gzopen().
- length - Максимальное количество символов для чтения из файла.
- allowable_tags - Необязательный параметр, строка с тегами, которые не должны удаляться.
Чтение строки длиной 100 символов:
<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 100);
echo $string;
gzclose($handle);
?>Текст без HTML тегов, которые были удалены.
Чтение с разрешением тегов <b> и <i>:
<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 200, '');
echo $string;
gzclose($handle);
?>Текст с жирным и курсивным оформлением.
После удаления gzgetss в PHP 8.0 рекомендуется использовать комбинацию других функций:
- gzgets() + strip_tags() - Позволяет получить тот же результат: чтение строки из gz-файла и удаление тегов.
- fgets() + strip_tags() с прозрачной декомпрессией - При использовании обертки 'zlib' можно работать со сжатыми файлами как с обычными.
- SplFileObject с фильтрацией - Объектно-ориентированный подход для обработки файлов.
Комбинация gzgets() и strip_tags() предпочтительнее, так как обеспечивает явный контроль над процессом.
Gzgetss в Python
Использование gzip и re модулей:
import gzip
import re
with gzip.open('file.gz', 'rt', encoding='utf-8') as f:
line = f.readline(100)
clean_line = re.sub(r'<[^>]*>', '', line)
print(clean_line)Текст без HTML тегов.
С использованием zlib и регулярных выражений:
const zlib = require('zlib');
const fs = require('fs');
const stream = fs.createReadStream('file.gz')
.pipe(zlib.createGunzip());
let data = '';
stream.on('data', chunk => data += chunk);
stream.on('end', () => {
const firstLine = data.split('\n')[0];
const cleanLine = firstLine.replace(/<[^>]*>/g, '');
console.log(cleanLine);
});Gzgetss в MySQL
Чтение сжатого файла средствами СУБД не предусмотрено, требуется предварительная распаковка.
Вызов функции приводит к фатальной ошибке:
<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 100); // Фатальная ошибка
?>Fatal error: Uncaught Error: Call to undefined function gzgetss()
Передача нересурса в первый аргумент:
<?
$string = gzgetss('not_a_resource', 100);
?>Warning: gzgetss() expects parameter 1 to be resource, string given
Попытка чтения из закрытого дескриптора:
<?
$handle = gzopen('file.gz', 'r');
gzclose($handle);
$string = gzgetss($handle, 100);
?>Warning: gzgetss(): supplied resource is not a valid stream resource
Функция gzgetss претерпела значительные изменения:
- PHP 4.3.0 - Добавлен необязательный параметр allowable_tags.
- PHP 7.0.0 - Функция объявлена устаревшей (deprecated).
- PHP 8.0.0 - Функция полностью удалена из языка. Все вызовы вызывают фатальную ошибку.
Удаление связано с наличием более универсальных и безопасных альтернатив, а также с общей политикой отказа от специализированных функций обработки строк.
Построчное чтение всего файла с фильтрацией:
<?
$handle = gzopen('logs.gz', 'r');
$cleanLines = [];
while (!gzeof($handle)) {
$line = gzgetss($handle, 1024, '
');
if ($line !== false) {
$cleanLines[] = trim($line);
}
}
gzclose($handle);
print_r($cleanLines);
?>Array
(
[0] => Лог-сообщение без тегов
[1] => Сообщение с
переносом строки
)Обработка HTML-контента с сохранением только безопасных тегов:
<?
$handle = gzopen('content.gz', 'r');
$allowed = '';
$content = '';
while (!gzeof($handle)) {
$content .= gzgetss($handle, 512, $allowed);
}
gzclose($handle);
echo $content;
?>Текст с выделением и ссылкой.
Чтение с предварительной проверкой и конвертацией:
<?
$handle = gzopen('win1251.gz', 'r');
$string = gzgetss($handle, 500);
if (mb_detect_encoding($string, 'UTF-8, Windows-1251') != 'UTF-8') {
$string = iconv('Windows-1251', 'UTF-8', $string);
}
echo $string;
gzclose($handle);
?>Текст в корректной UTF-8 кодировке.