'; // 允许段落和超链接
$cleanText = strip_tags($content, $allowedTags);
$cleanText = preg_replace('/<(p|a)[^>]>/', '<$1>', $cleanText);
三、结构化处理方案:DOMDocument类
对于需要保持文档结构的场景,PHP的DOMDocument类提供树状解析能力。该方案通过构建文档对象模型,实现精准的节点操作:
php
$doc = new DOMDocument;
@$doc->loadHTML($htmlContent); // 忽略解析错误
$scriptNodes = $doc->getElementsByTagName('script');
while ($node = $scriptNodes->item(0)) {
$node->parentNode->removeChild($node);
echo $doc->saveHTML;
此方法特别适合处理富文本编辑器内容,可配合XPath实现复杂查询:
php
$xpath = new DOMXPath($doc);
$dangerousNodes = $xpath->query("//[@onclick or @style]");
foreach ($dangerousNodes as $node) {
$node->parentNode->removeChild($node);
四、企业级安全方案:HTMLPurifier库

在需要防范XSS攻击的金融、医疗等场景,推荐使用HTMLPurifier进行深度净化。该库通过白名单机制和CSS验证,提供企业级的安全保障:
php
require_once 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault;
$config->set('HTML.Allowed', 'p,a[href]'); // 仅允许带链接的a标签
$purifier = new HTMLPurifier($config);
$cleanHTML = $purifier->purify($userInput);
通过配置文件可细化过滤规则,例如:
禁用`data-`属性防止XSS
限制图片URL协议为HTTPS
过滤内联样式中的危险表达式
五、混合增强方案:自定义函数开发
针对特殊业务需求,开发者可组合多种技术实现定制过滤器。例如创建同时清除标签和内容的处理函数:
php
function advanced_filter($html, $allowedTags = []) {
$dom = new DOMDocument;
@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
// 移除黑名单节点
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//script|//iframe') as $node) {
$node->parentNode->removeChild($node);
// 白名单过滤
if (!empty($allowedTags)) {
$elements = $xpath->query('//[not(self::'.implode(' or not(self::', $allowedTags).')]');
foreach ($elements as $element) {
$element->parentNode->removeChild($element);
return $dom->saveHTML;
技术选型指南

| 场景特征 | 推荐方案 | 处理效率 | 安全性 |
|-|--|-|--|
| 简单文本提取 | strip_tags函数 | ★★★★ | ★★ |
| 格式复杂文档 | 正则表达式 | ★★★ | ★★ |
| 富文本内容处理 | DOMDocument类 | ★★ | ★★★ |
| 金融级安全需求 | HTMLPurifier库 | ★★ | ★★★★ |
| 特殊业务规则 | 自定义函数 | ★ | ★★★★ |
在实际开发中,建议采用分层过滤策略:先用strip_tags进行初步处理,再通过DOMDocument修正文档结构,最后用HTMLPurifier进行深度净化。这种组合方案在电商平台的商品详情页处理中表现优异,既能保留必要的排版格式,又能有效阻断恶意代码注入。
通过理解不同方案的设计原理和应用边界,开发者可以根据项目需求选择最优解。需要注意的是,任何过滤方案都应配合输入验证、输出编码等安全措施,构建完整的安全防御体系。