php如何去除文本中html
- 前端开发
- 2025-08-01
- 3021
strip_tags()
函数去除文本里的 HTML 标签,如
echo strip_tags($htmlText);
就能得到纯净文本。
PHP开发中,去除文本中的HTML标签是一项常见需求,例如从用户输入中过滤潜在反面代码、提取纯文本内容或清理富文本编辑器生成的数据,以下是几种主流实现方法及其详细解析:
使用 strip_tags()
函数
这是PHP内置的最简单方案,专为快速剥离HTML标签设计,其核心语法为:
string strip_tags ( string $str [, string|array $allowable_tags ] )
- 参数说明:第一个参数是待处理的字符串;第二个可选参数可指定需保留的标签(如
<p>
),未设置时则删除所有标签。 - 示例代码:
$html = '<div><p>Hello, <strong>World</strong></p><a href="#link">Click</a></div>'; // 完全去除所有标签 $cleanText1 = strip_tags($html); // 结果: "Hello, World Click" // 仅保留段落标签 $cleanText2 = strip_tags($html, '<p>'); // 结果: "<p>Hello, <strong>World</strong></p>" echo $cleanText1 . "n" . $cleanText2;
- 特点:执行效率高且语法简洁,但无法处理嵌套结构或保留部分样式属性,若原始文档包含不规范写法(如未闭合标签),可能导致意外截断。
通过正则表达式匹配替换
当需要更灵活的控制时,可采用preg_replace()
配合正则模式实现精准清洗,常用模式包括:
| 正则表达式 | 作用场景 | 备注 |
|————————–|——————————|—————————–|
| /<[^>]>/
| 匹配所有标准HTML标签 | 忽略大小写和自闭合标签 |
| /<(/?)[a-zA-Z]+[^>]>/
| 严格定义边界 | 适用于复杂文档解析 |
| /<scriptb[^>]>.?</script>/is
| 定向清除JavaScript脚本 | “s”修饰符使“.”匹配换行符 |
典型用例:
// 基础用法:移除全部标签 $html = '<h1>Title</h1><img src="image.jpg"/>'; $pattern = '/<[^>]+>/'; $result = preg_replace($pattern, '', $html); // 输出: "Title" // 进阶技巧:仅删除危险标签(如script/style) $maliciousCode = <<<EOT <script>alert('XSS');</script><style>body{color:red;}</style>Safe Content EOT; $safeContent = preg_replace('/<(script|style)[^>]>.?</1>/is', '', $maliciousCode); echo $safeContent; // 输出: "Safe Content"
- 优势:支持复杂逻辑判断,可同时处理多类标签;缺点是对性能要求较高且正则编写容易出错。
基于DOMDocument的对象化操作
此方案利用PHP的XML扩展库构建结构化解析器,适合处理碎片化或非常规HTML片段,关键步骤如下:
- 创建DOM实例并加载内容;
- 定位到目标节点(通常是
<body>
); - 提取文本内容。
完整示例:
$brokenHtml = '<html><head><title>Test</title></head><body><div>Main Text <span>with nested</span></div></body></html>'; try { $dom = new DOMDocument(); // libxml_use_internal_errors(true)防止因格式错误中断执行 libxml_use_internal_errors(true); $dom->loadHTML($brokenHtml); $bodyNode = $dom->getElementsByTagName('body')->item(0); $plainText = $bodyNode->textContent; // 自动展平嵌套层级 echo trim($plainText); // 输出: "Main Text with nested" } catch (Exception $e) { // 异常处理逻辑... }
- 对比优势:能正确解析畸形HTML,保留空白符和注释信息;但内存占用较大,不适合超大文档处理。
第三方库HTMLPurifier增强安全性
针对存在XSS风险的场景(如评论区提交),推荐使用专业过滤组件HTMLPurifier,安装后基础调用方式为:
require_once 'HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $purifier = new HTMLPurifier($config); $userInput = '<img src="hackersite.com" onerror="stealCookies()">'; $safeOutput = $purifier->purify($userInput); echo $safeOutput; // 彻底清除事件处理器属性
该库不仅移除标签,还会标准化属性值、转义特殊字符,并提供白名单机制控制允许使用的标签及属性组合。
性能与适用场景对比表
方法 | 执行速度 | 安全性 | 功能扩展性 | 推荐场景 |
---|---|---|---|---|
strip_tags() | 中等 | 低 | 简单文本快速清理 | |
正则表达式 | 依赖写法质量 | 中 | 定制化标签过滤 | |
DOMDocument | 高 | 高 | 复杂文档重构 | |
HTMLPurifier | 极高 | 极高 | 用户生成内容消毒 |
FAQs
Q1: strip_tags()能否彻底防止XSS攻击?
A: 不能直接依赖!虽然它能移除大部分标签,但某些特殊属性(如onmouseover=alert(1)
)仍可能残留在保留的无害标签中,建议对不可信来源的内容结合HTML实体编码进一步处理。
Q2: 如何处理带有嵌套结构的HTML?
A: 优先选用DOMDocument方案,例如对于<div><p>Level 1 <span>Level 2</span></p></div>
这样的多层嵌套,直接调用textContent
会自动合并各层级文本,而正则表达式可能需要递归匹配