strip_tags()仅提取纯文本并删除所有HTML标签及属性,不保留换行空格,白名单只控制保留标签类型,不防XSS,实体编码需先解码再处理,复杂场景应换用HTMLPurifier等专用库。

用 strip_tags() 去掉 HTML 标签最常用,但默认会连换行和空格一起吃掉
它不是“删除标签”而是“提取纯文本”,所以 <p>hello</p><div>world</div> 会变成 helloworld(中间没空格)。如果你需要保留段落间的可读性,得手动补空格或换行。
- 只留文本内容、丢弃所有标签和属性,这是它的设计目标
- 第二个参数可以放白名单,比如
strip_tags($html, ['br', 'p', 'strong']),但注意:白名单只控制“哪些标签保留”,不控制“标签里的属性是否保留”——属性一律被删 - 对含 JS 或 CSS 的 HTML 不安全,
strip_tags()不解析上下文,<script>alert(1)</script>会被干掉,但<img src="x" onerror="alert(1)">的onerror属性照样被删,只是没执行而已——它不防 XSS,别当净化函数用
想保留换行/缩进?得自己处理 strip_tags() 吐出来的“黏糊文本”
原始 HTML 里 <p>第一段</p><p>第二段</p> 经 strip_tags() 后是 第一段第二段,人眼看不出分隔。这时候不能靠正则硬塞 \n,因为标签嵌套和空格位置不可控。
- 简单场景:在调用后加
preg_replace('/\s+/', ' ', $text)把多余空白压成单空格,再trim() - 稍讲究点:先用
str_replace(['<br>', '<br/>', '<br />'], "\n", $html)把换行标签转成真实换行,再strip_tags(),最后preg_replace('/\n\s*\n/', "\n\n", $text)合并空行 - 别用
nl2br()反向操作——那是给 HTML 用的,你已经没有标签了
htmlspecialchars_decode() 和 strip_tags() 完全不是一回事
有人看到页面显示 <p>test</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img
src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill6712" title="Wechat HTML Publisher">Wechat HTML Publisher</a>
<p>直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p>
</div>
<a href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div> 就以为是 HTML 标签没去掉,其实是 HTML 实体编码问题。这是两层事: 是字符数据,不是标签语法。
-
strip_tags()对<p></p>完全无效,因为它根本不是标签,只是几个字符 - 得先
htmlspecialchars_decode($html, ENT_NOQUOTES)把实体转回来,再strip_tags() - 顺序错了会出问题:如果先
strip_tags()再htmlspecialchars_decode(),<script></script>变成<script>,等于自己造了个可执行标签
复杂 HTML 或要防 XSS?别硬刚,换专用库
strip_tags() 是轻量工具,不是解析器。遇到 <div onclick="alert(1)">xxx</div> 或自闭合 SVG 标签,它照删不误,但不会告诉你属性里有没有危险逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 真要过滤用户输入 HTML,用
HTMLPurifier(PHP)或DOMDocument+ 白名单遍历——前者重但可靠,后者要自己写逻辑防内存泄漏和 DTD 加载失败 -
DOMDocument::loadHTML()解析后再取$dom->textContent看似更“标准”,但它会自动修复破损 HTML,可能引入意外空格或结构变化,且对含<!DOCTYPE>或 XML 声明的文档容易报错 - 性能上,
strip_tags()比 DOM 方案快 5–10 倍,简单清洗就别杀鸡用牛刀


















