fgetss() 函数是PHP中用于从打开的文件中读取一行并剥离HTML、PHP和NULL字符标签的函数。它在旧版本中用于安全地读取可能包含HTML标签的文件内容。
语法 (已废弃)
string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] )
参数说明
| 参数 | 描述 | 是否必需 |
|---|---|---|
| handle | 文件指针,由 fopen() 创建 |
是 |
| length | 可选。要读取的最大字节数 | 否 |
| allowable_tags | 可选。指定允许保留的HTML标签 | 否 |
替代方案
由于 fgetss() 已废弃,以下是推荐的替代方法:
方法1:使用 strip_tags() 替代
<?php
// 旧代码 (PHP 7.3以下)
$file = fopen("data.txt", "r");
$line = fgetss($file); // 已废弃
// 新代码 (PHP 7.3+)
$file = fopen("data.txt", "r");
$line = fgets($file);
$clean_line = strip_tags($line); // 使用strip_tags()替代
fclose($file);
?>
方法2:完整替代示例
<?php
function safeReadLine($file_handle, $length = 1024, $allowable_tags = '') {
$line = fgets($file_handle, $length);
if ($line === false) {
return false;
}
return strip_tags($line, $allowable_tags);
}
// 使用示例
$file = fopen("data.txt", "r");
while (($line = safeReadLine($file)) !== false) {
echo $line . "<br>";
}
fclose($file);
?>
方法3:保留特定标签
<?php
// 旧代码:允许<p>和<br>标签
$line = fgetss($file, 1024, '<p><br>');
// 新代码:使用strip_tags()的第二个参数
$line = fgets($file);
$clean_line = strip_tags($line, '<p><br>');
?>
历史版本示例
以下示例仅用于历史参考,不要在PHP 7.3+ 版本中使用:
<?php
// PHP 7.2及以下版本的使用方式
$file = fopen("data.txt", "r");
// 基本用法 - 移除所有HTML标签
while ($line = fgetss($file)) {
echo $line . "<br>";
}
// 允许特定标签
rewind($file);
while ($line = fgetss($file, 1024, '<b><i><u>')) {
echo $line . "<br>";
}
fclose($file);
?>
与其他函数的比较
| 函数 | 描述 | 状态 |
|---|---|---|
fgetss() |
读取一行并剥离HTML/PHP标签 | 已移除 (PHP 8.0+) |
fgets() |
读取一行(包含HTML标签) | 可用 |
strip_tags() |
从字符串中剥离HTML/PHP标签 | 可用 |
htmlspecialchars() |
将特殊字符转换为HTML实体 | 可用 |
迁移建议
迁移到新版本的步骤
- 将所有
fgetss()调用替换为fgets() - 在读取后添加
strip_tags()或htmlspecialchars() - 如果需要保留特定标签,使用
strip_tags($string, $allowable_tags) - 测试所有文件读取功能,确保过滤逻辑正确
完整迁移示例
<?php
// 旧版本代码
function readSecureFile($filename) {
$file = fopen($filename, "r");
$content = [];
while ($line = fgetss($file, 1024, '<br><strong>')) {
$content[] = $line;
}
fclose($file);
return $content;
}
// 新版本代码
function readSecureFileNew($filename) {
$file = fopen($filename, "r");
$content = [];
while ($line = fgets($file)) {
// 使用strip_tags替代fgetss
$clean_line = strip_tags($line, '<br><strong>');
$content[] = $clean_line;
}
fclose($file);
return $content;
}
?>
最佳实践
在新的PHP项目中,建议始终使用 fgets() 配合 htmlspecialchars() 或 strip_tags() 来确保安全性,并明确指定所需的过滤逻辑。