PHP strip_tags() 函数(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言:PHP strip_tags() 函数的重要性
在 PHP 开发中,处理用户输入或外部数据时,确保内容的安全性和合法性是关键任务之一。HTML 或 JavaScript 标签的意外注入可能导致跨站脚本攻击(XSS)或其他安全风险。PHP strip_tags()
函数正是为此而生,它能高效地清除文本中的 HTML 标签,帮助开发者构建更安全的 Web 应用。无论你是编程新手还是有一定经验的开发者,掌握这一工具都能显著提升代码的健壮性。
函数基础:定义与语法
什么是 strip_tags()?
strip_tags()
是 PHP 内置的字符串处理函数,其核心功能是去除字符串中的 HTML 和 PHP 标签。它的名称来源于英文单词 "strip"(剥离)和 "tags"(标签),形象地表达了该函数的作用:像剥洋葱一样,将文本中的标签层层剥离,仅保留纯文本内容。
基础语法
string strip_tags ( string $str [, string $allowed_tags ] )
- 参数说明:
$str
:需要处理的原始字符串。$allowed_tags
(可选):允许保留的 HTML 标签列表,用字符串形式指定。
例如,执行以下代码:
$text = "<p>欢迎来到我的博客!</p><script>alert('恶意代码')</script>";
$clean_text = strip_tags($text);
echo $clean_text;
输出结果将为:
欢迎来到我的博客!
可见,strip_tags()
成功移除了所有标签,包括潜在的恶意 <script>
标签。
参数详解:灵活控制标签过滤
允许特定标签的保留
默认情况下,strip_tags()
会移除所有标签。但通过第二个参数 $allowed_tags
,可以选择性保留部分标签。例如,允许保留 <a>
和 <b>
标签:
$allowed = "<a><b>";
$text = "<a href='link.html'>链接</a> <b>加粗文字</b> <div>隐藏内容</div>";
$clean_text = strip_tags($text, $allowed);
echo $clean_text; // 输出:"<a href='link.html'>链接</a> <b>加粗文字</b> 隐藏内容"
此时,<div>
标签被过滤,而允许的标签得以保留。
返回值与错误处理
函数返回处理后的字符串。若输入参数类型错误(如 $str
非字符串),PHP 会触发警告。因此,在实际开发中建议添加类型检查:
if (!is_string($input)) {
throw new InvalidArgumentException("输入必须为字符串");
}
$safe_text = strip_tags($input);
实际案例:应用场景与代码示例
场景一:过滤用户评论中的 HTML 标签
假设用户在提交评论时输入了以下内容:
<p>这是一条评论!</p><img src="x.png" onload="alert('攻击')"/>
通过 strip_tags()
可以直接清除所有标签:
$user_input = $_POST['comment'];
$clean_comment = strip_tags($user_input);
// 输出:这是一条评论!
这样既保证了评论内容的纯文本性,又避免了潜在的 XSS 攻击。
场景二:允许有限的富文本格式
在允许用户使用简单格式的场景(如论坛发帖),可以保留部分标签:
$allowed = "<strong><em>";
$post_content = "<strong>重点内容</strong> <script>alert('危险')</script>";
$safe_content = strip_tags($post_content, $allowed);
// 输出:重点内容
此时,<script>
标签被过滤,而 <strong>
标签保留,实现了格式与安全的平衡。
场景三:结合 htmlspecialchars() 提升安全性
strip_tags()
能过滤标签,但无法处理标签内的特殊字符(如 &
、"
)。此时可结合 htmlspecialchars()
进行双重过滤:
$raw_input = "<h1>标题 & 特殊字符</h1>";
$safe_text = htmlspecialchars(
strip_tags($raw_input),
ENT_QUOTES | ENT_HTML5,
'UTF-8'
);
// 输出:标题 & 特殊字符
这样既移除了标签,又将特殊字符转义,进一步降低风险。
安全与局限性:避免过度依赖
XSS 攻击的防御边界
strip_tags()
是防御 XSS 的有效工具之一,但需注意其局限性:
- 无法处理嵌套标签:如
<script>...</script>
被移除,但若标签被错误闭合(如<script
),函数可能无法完全清除。 - 不处理属性值:攻击者可能通过标签属性注入恶意代码,例如
<img src="x" onerror="alert('攻击')"/>
。此时需结合htmlspecialchars()
或白名单机制。
安全建议
- 结合其他函数:如
htmlspecialchars()
转义特殊字符。 - 白名单策略:仅允许必要标签(如
<a>
、<br>
),而非依赖黑名单过滤。 - 输入验证:对用户输入进行格式和长度的严格验证。
常见问题与解答
Q1: 如何保留标签内的 HTML 实体?
若需保留标签内的 &
、<
等字符,需先使用 htmlspecialchars_decode()
解码:
$encoded = "<p>测试内容</p>";
$decoded = htmlspecialchars_decode($encoded);
$clean = strip_tags($decoded);
// 输出:测试内容
Q2: 如何处理多行文本或换行符?
strip_tags()
会保留原始文本的换行符和空格,但若需统一格式,可用 nl2br()
或正则表达式处理:
$text = "第一行\n第二行\n<img src='x'/>";
$clean = nl2br(strip_tags($text));
// 输出:第一行<br />\n第二行
Q3: 函数在 PHP 8.x 版本中的变化?
PHP 8.x 对 strip_tags()
的语法和功能无重大改动,但增强了对 Unicode 字符的支持。建议在开发前确认 PHP 版本兼容性。
结论:善用工具,构建安全代码
PHP strip_tags()
函数是开发者处理文本过滤的利器,尤其在用户输入验证、内容安全领域发挥着重要作用。通过灵活使用其参数、结合其他函数,并理解其安全边界,开发者可以构建更健壮的 Web 应用。未来,随着 PHP 版本的迭代和安全需求的演变,这一工具的功能和最佳实践也值得持续关注。
希望本文能帮助你更深入地理解 PHP strip_tags()
函数,将其熟练运用于实际开发中。