strip_tags第二个参数必须是字符串而非数组,php 7.2中传数组会触发警告且结果不可预期;正确写法为'strong br'等空格分隔的字符串,且标签需完整、小写、闭合。

strip_tags 第二个参数要传字符串,不是数组
PHP 7.2 中 strip_tags 的 $allowable_tags 参数只接受 字符串,不能传数组。传数组会触发警告(Warning: strip_tags() expects parameter 2 to be string, array given),且结果不可预期。
常见错误写法:
strip_tags($html, ['<p>', '<br>'])</p>—— 这在 PHP 7.2 下直接报错。
正确写法是把多个标签拼成一个带空格分隔的字符串:
strip_tags($html, '<p> <br><strong>')</strong></p>
- 注意:每个标签必须写完整闭合形式(如
<p></p>、<br>),但<br>实际上会被识别为<br>或<br>,strip_tags内部不校验合法性 - 标签名大小写敏感,
<p></p>和<p></p>视为不同;建议统一小写
保留 <br> 标签时要注意换行丢失风险
strip_tags 剥离后不会自动把 <br> 转成换行符 \n,它只是“不删掉”这个标签——所以输出里会残留 <br> 字符串,浏览器可能渲染为文字而非换行。
如果你需要视觉换行,得额外处理:
- 先用
strip_tags($html, '<br>')
保留<br> - 再用
str_replace(['<br>', '<br>', '<br>'], "\n", $output)替换为换行符 - 或者用
nl2br()反向操作(仅适用于你已转义过、且想把 \n 变回
的场景)
不闭合标签或破损 HTML 会导致意外截断
strip_tags 是基于简单字符串匹配的,不解析 DOM。遇到以下情况会出问题:
-
<p>hello <span>world</span></p>(缺少闭合)→ 可能从<span></span>开始直到末尾全被当作文本删掉 -
<script>alert(1)</script>被完整剥离,但若写成<scr>ipt></scr>,可能只删掉部分 - 属性内容含
>(如<div data-attr="a>b">)会提前终止标签识别,导致后续文本误判<p>所以,如果输入 HTML 来源不可信(如用户提交),不要依赖 <code>strip_tags做安全过滤,它防不住 XSS。PHP 7.2 下没有内置多标签白名单的替代函数
PHP 7.2 不支持
strip_tags($html, ['p', 'br'])这种数组写法,也没有strip_selected_tags这类标准函数。如果真需要更健壮的保留逻辑(比如只留内联标签、排除所有<script></script>和<style></style>),只能自己封装:- 用
DOMDocument加白名单遍历节点(较重,但安全) - 用正则预清洗(例如先
preg_replace('/<script>]*>.*?<\/script>/is', '', $html)</script>) - 或者退一步:先
strip_tags($html)得纯文本,再用htmlspecialchars()输出,彻底放弃格式
真正容易被忽略的是:哪怕你写了
strip_tags($html, '<p> <br>')</p>
,只要原始 HTML 含有<!-- comment -->或<?php ... ?>,它们仍会被一并清除——因为strip_tags默认就删 PHP/HTML 注释和指令,这个行为无法通过$allowable_tags改变。 - 用











