strip_tags()仅剥离html标签而保留文本内容,不防xss,允许通过$allowable_tags参数白名单保留指定标签(须严格小写无属性),对注释、cdata、php伪标签等行为不稳定,非安全过滤方案。

strip_tags 会删掉所有 HTML 标签,但保留标签内的文本
它不是“过滤”或“清理富文本”,而是粗暴地剥掉 <p></p>、<div>、<code><script></script> 这类标签,只留下中间的文字。比如 <strong>hello</strong> 经过 strip_tags() 变成 hello,而不是空字符串或带样式的文本。
常见误用是以为它能防 XSS —— 它不能。它不处理属性(如 <a href="javascript:alert(1)"></a>)、不转义引号、也不识别自闭合或嵌套异常标签。仅适合纯展示场景下的简易清洗,比如摘要截取、日志脱敏、表单预览等。
第二个参数 $allowable_tags 控制哪些标签可以保留
传入字符串或数组,指定允许保留的标签。注意:只认开始标签名,不校验是否闭合,也不管属性。
-
strip_tags($html, '<p><br></p> <ul><li>')</li></ul>会保留这四个标签及其内容(包括嵌套在其中的其他标签) -
strip_tags($html, ['<p>', '<br>'])</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a> <p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p> </div> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>效果同上,数组写法更清晰 - 如果写成
<p></p>或<p></p>(带空格),不会被识别 —— 必须严格匹配小写、无空格、无属性的开标签形式 - 保留的标签仍会被原样输出,
strip_tags('<script>alert(1)</script>', '<script>')</script>会直接输出<script>alert(1)</script>,非常危险
遇到 或 CDATA 时行为不稳定
strip_tags() 对 HTML 注释、、XML 声明等没有定义行为。不同 PHP 版本表现可能不一致:
- PHP 7.4+ 通常会把注释当作普通文本保留(即显示为
<!-- 注释 -->) - 某些旧版本可能错误地截断或跳过整段内容
- 遇到
<?php echo 'xss'; ?>这类伪标签,它不识别,会原样保留 —— 所以不能用于处理混合 PHP 模板的字符串 - 如果输入含非法 UTF-8 字节序列,函数可能提前截断或返回空字符串,建议先用
mb_convert_encoding()规范编码
替代方案比硬扛 strip_tags 更可靠
真要处理用户提交的 HTML,别依赖 strip_tags()。它设计目标就是“快而糙”,不是安全过滤器。
- 需要白名单式 HTML 清洗:用
HTMLPurifier库,可配策略、支持 CSS/JS 属性控制 - 只需提取纯文本且兼容各种格式:用 DOMDocument + XPath,例如加载后调用
$dom->textContent - 简单场景下想更可控:先用
preg_replace()去掉 script/style 标签块,再用strip_tags(),但正则处理 HTML 本身就有风险 - 注意:
htmlspecialchars()是另一条路 —— 它不删标签,而是转义,适合输出到 HTML 页面前防御 XSS,和strip_tags()目标完全不同
最常被忽略的一点:strip_tags() 不改变字符串编码,也不做任何长度检查。超长输入可能引发内存问题,生产环境建议加 mb_strimwidth() 或截断逻辑配合使用。










