本文目录导读:

- strip_tags() - 最基础的方法
- HTML Purifier - 推荐的安全方案
- filter_var() 带 FILTER_SANITIZE_STRING
- 正则表达式过滤
- DOMDocument 方式
- Laravel 框架方案
- 推荐使用方案
- 不同场景的选择建议
- 重要提示
在PHP项目中过滤清除HTML标签,主要有以下几种常用方法:
strip_tags() - 最基础的方法
$html = '<p>Hello <b>World</b></p>'; $clean = strip_tags($html); echo $clean; // 输出:Hello World // 保留特定标签 $clean = strip_tags($html, '<p><b>'); echo $clean; // 输出:<p>Hello <b>World</b></p>
优点:简单直接
缺点:安全性不够,无法处理恶意属性
HTML Purifier - 推荐的安全方案
require_once '/path/to/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,b,a[href],img[src]');
$purifier = new HTMLPurifier($config);
$clean = $purifier->purify($html);
优点:安全性最高,可配置性强
缺点:需要安装库,性能开销较大
filter_var() 带 FILTER_SANITIZE_STRING
$html = '<script>alert("xss")</script>';
$clean = filter_var($html, FILTER_SANITIZE_STRING);
注意:PHP 8.1+ 已弃用此过滤器,不推荐使用
正则表达式过滤
function removeHtmlTags($html) {
// 移除所有HTML标签
return preg_replace('/<[^>]*>/', '', $html);
}
// 更严格的方式
function sanitizeHtml($input) {
return preg_replace('/(<[^>]+>|<[^>]+$)/', '', $input);
}
优点:灵活
缺点:容易出错,可能被绕过
DOMDocument 方式
function stripHtmlTags($html) {
$doc = new DOMDocument();
@$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$text = '';
foreach ($doc->getElementsByTagName('body')->item(0)->childNodes as $node) {
$text .= $doc->saveHTML($node);
}
return strip_tags($text);
}
Laravel 框架方案
如果使用 Laravel,可以直接使用辅助函数:
// 使用 e() 函数 $clean = e($html); // 或者使用 htmlspecialchars $clean = htmlspecialchars($html, ENT_QUOTES, 'UTF-8');
推荐使用方案
/**
* 安全过滤HTML标签
*
* @param string $html 需要过滤的内容
* @param bool $removeSpaces 是否移除多余空格
* @return string
*/
function safeStripTags($html, $removeSpaces = false) {
// 1. 先转义特殊字符
$html = htmlspecialchars($html, ENT_QUOTES, 'UTF-8');
// 2. 移除HTML标签
$html = strip_tags($html);
// 3. 可选:移除多余空格
if ($removeSpaces) {
$html = preg_replace('/\s+/', ' ', $html);
$html = trim($html);
}
return $html;
}
不同场景的选择建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 简单的文本清洗 | strip_tags() |
速度快,够用 |
| 用户输入内容 | HTML Purifier | 安全性最高 |
| 防止XSS攻击 | htmlspecialchars() + strip_tags() |
双重防护 |
| 允许部分标签 | HTML Purifier | 精细控制 |
| 高并发场景 | 自定义正则+黑名单 | 性能优先 |
重要提示
- 永远不要相信用户输入,即使过滤也要多层级防护
- 根据使用场景选择合适的过滤级别
- 输出时使用
htmlspecialchars()转义 - 如果需要允许某些HTML标签,优先使用白名单方式
选择哪种方案取决于你的具体需求:安全性要求、性能要求、是否需要保留部分标签等。