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)" alt="php怎么删除html标签_php怎么去除html代码【去除】" >的onerror属性照样被删,只是没执行而已——它不防 XSS,别当净化函数用
想保留换行/缩进?得自己处理 strip_tags() 吐出来的“黏糊文本”
原始 HTML 里 <p>第一段</p>
<p>第二段</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2421" title="摄图AI"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/176473196985484.png" alt="摄图AI" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2421" title="摄图AI">摄图AI</a>
<p>摄图网旗下AI视觉创作平台</p>
</div>
<a href="/ai/2421" title="摄图AI" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div> 经 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> 就以为是 HTML 标签没去掉,其实是 HTML 实体编码问题。这是两层事:< 是字符数据,不是标签语法。
立即学习“PHP免费学习笔记(深入)”;
-
strip_tags()对<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 标签,它照删不误,但不会告诉你属性里有没有危险逻辑。
- 真要过滤用户输入 HTML,用
HTMLPurifier(PHP)或DOMDocument+ 白名单遍历——前者重但可靠,后者要自己写逻辑防内存泄漏和 DTD 加载失败 -
DOMDocument::loadHTML()解析后再取$dom->textContent看似更“标准”,但它会自动修复破损 HTML,可能引入意外空格或结构变化,且对含或 XML 声明的文档容易报错 - 性能上,
strip_tags()比 DOM 方案快 5–10 倍,简单清洗就别杀鸡用牛刀










