PHP strip_tags() 函数(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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() 或白名单机制。

安全建议

  1. 结合其他函数:如 htmlspecialchars() 转义特殊字符。
  2. 白名单策略:仅允许必要标签(如 <a><br>),而非依赖黑名单过滤。
  3. 输入验证:对用户输入进行格式和长度的严格验证。

常见问题与解答

Q1: 如何保留标签内的 HTML 实体?

若需保留标签内的 &< 等字符,需先使用 htmlspecialchars_decode() 解码:

$encoded = "&lt;p&gt;测试内容&lt;/p&gt;";  
$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() 函数,将其熟练运用于实际开发中。

最新发布