strip_tags()仅删除HTML/PHP标签,不防XSS、不处理注释/CDDATA、不保留语义;需配合正则清理注释、手动映射换行、输出时再htmlspecialchars(),或改用HTMLPurifier。

用 strip_tags() 去掉 HTML 标签最直接
strip_tags() 是 PHP 内置函数,专为这事设计,不依赖外部库,开箱即用。它会移除所有 HTML 和 PHP 标签(包括 <?php ... ?>),只保留纯文本内容。
常见错误是以为它能“安全地净化 HTML”,其实不能——它不做转义、不处理属性、不防 XSS,只是粗暴删标签。如果原始字符串里有 <script>alert(1)</script>,执行后只剩 alert(1),但这段 JS 仍可能被后续上下文误执行。
- 基础用法:
strip_tags($html)—— 删除全部标签 - 允许白名单标签:
strip_tags($html, ['br', 'p', 'a'])—— 注意第二个参数必须是数组,且标签名不带尖括号 - 不支持通配符或正则语法;传入
'<p>'</p>或'p'都不行,必须是['p'] - 对自闭合标签(如
<img />)同样生效,整段删掉
遇到嵌套注释或 CDATA 时 strip_tags() 会失效
PHP 8.1+ 的 strip_tags() 对 <!-- ... --> 注释和 <![CDATA[...]]> 区块不做处理,它们会被原样保留。如果字符串来自不可信来源(比如用户提交的富文本编辑器内容),这些区块里可能藏恶意脚本或混淆代码。
例如:"<!-- <script>fetch('/steal')</script> -->hello" 经 strip_tags() 后变成 "<script>fetch('/steal')</script> hello",危险依旧。
立即学习“PHP免费学习笔记(深入)”;
- 临时补救:先用
preg_replace()清理注释和 CDATA,再调strip_tags() - 示例清理注释:
preg_replace('/<!--[\s\S]*?-->/i', '', $html) - CDATA 更麻烦些:
preg_replace('/<!\[CDATA\[[\s\S]*?\]\]>/i', '', $html) - 注意:正则处理 HTML 本身就不稳健,仅适用于结构简单、可控的场景
需要保留换行或格式语义?别只靠 strip_tags()
strip_tags() 会把 <br>、<p> 这类标签连同其语义一并抹掉,结果是一大段挤在一起的文本。如果你希望 <br> 变成 \n、<p> 前后加空行,就得自己映射。
典型做法是先用 str_replace() 或 preg_replace() 把特定标签替换成占位符或换行符,再调 strip_tags() 处理剩余标签。
- 保留换行:
$text = str_replace(['<br>', '<br/>', '<br />'], "\n", $html); $text = strip_tags($text); - 保留段落分隔:
$text = preg_replace('/<\/p>/i', "\n\n", $html); $text = strip_tags($text); - 注意大小写:HTML 标签不区分大小写,正则要加
i修饰符 - 避免过度替换:比如把
<pre><code>echo "<div>"</code></pre>里的引号内<div>也替换了,就破坏了原意
真正要防 XSS?strip_tags() 不够用
去除标签 ≠ 安全输出。比如 <a href="javascript:alert(1)">click</a>,strip_tags() 删掉 <a> 标签后剩下 click,看似安全——但如果这段文本又被拼进 HTML 属性或 JS 字符串里,风险就回来了。
真实防御链通常是:输入时过滤(白名单 HTML)、存储时转义(htmlspecialchars())、输出到不同上下文用不同编码(HTML / JS / URL)。
- 仅用于展示纯文本?
strip_tags($input)+htmlspecialchars($text, ENT_QUOTES, 'UTF-8')双保险更稳妥 - 若需保留部分 HTML(如后台富文本),必须用专用库如
HTMLPurifier,它基于规则引擎做深度解析和清理 - PHP 自带的
filter_var($input, FILTER_SANITIZE_SPECIAL_CHARS)实际等价于htmlspecialchars(),不是去标签工具
实际项目里,strip_tags() 很快能上手,但它的边界很窄:只管“删标签”,不管“是否安全”“是否可读”“是否兼容”。拿不准的时候,先问一句——这字符串最终会出现在哪?HTML 正文?JS 字符串?CSV 导出?不同位置,清理策略完全不同。



















