0

0

php怎么过滤html标签 php字符串去除html代码【重点】

穿越時空

穿越時空

发布时间:2026-03-02 19:38:03

|

790人浏览过

|

来源于php中文网

原创

php怎么过滤html标签 php字符串去除html代码【重点】

strip_tags() 最快,但默认不处理属性和自闭合标签

strip_tags() 是 PHP 内置函数,专为这事设计,性能好、不用装扩展。但它只删标签,不解析 HTML 结构 —— 比如 <img src="x" alt="php怎么过滤html标签 php字符串去除html代码【重点】" > 会被整段干掉,但 <script>alert(1)</script> 里的 JS 代码不会执行,只是文字被留下(除非你同时用了 htmlspecialchars())。

常见错误是以为它能“安全过滤”,结果用户提交 <a href="javascript:alert(1)">点我</a>strip_tags() 后变成纯文本 点我,看似没问题;但如果后续拼进 HTML 属性里(比如 <div title="'.$str.'">),就可能触发 XSS。 <ul> <li>只传字符串: <code>strip_tags($html)

  • 想保留某些标签?加白名单数组:strip_tags($html, ['br', 'p', 'strong'])
  • 注意:白名单只支持开始/结束标签,<hr> 这种写法在旧 PHP 版本里可能被忽略
  • PHP 8.1+ 对自闭合标签(如 <br>)识别更稳,老版本建议先 str_replace() 统一成 <br> 再处理
  • 要真正防 XSS,不能只靠 strip_tags()

    它不转义引号、不处理属性里的 JS 协议、不清理 CSS 表达式(如 style="background:url(javascript:alert())")。真实场景中,用户输入往往要嵌入 HTML 属性、JS 字符串或 JSON,这时光去标签远远不够。

    • 如果输出到 HTML 文本内容(比如 <p>{{ $text }}</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/ai/2410" title="遨虾"><img src="https://img.php.cn/upload/ai_manual/001/246/273/176421356013932.png" alt="遨虾" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/ai/2410" title="遨虾">遨虾</a> <p>1688推出的跨境电商AI智能体</p> </div> <a href="/ai/2410" title="遨虾" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>):先 strip_tags(),再 htmlspecialchars($text, ENT_QUOTES, 'UTF-8')
    • 如果输出到 HTML 属性值(比如 <div data-desc="'.$text.'">):必须用 <code>htmlspecialchars(),且 ENT_QUOTES 不可省 —— 单引号也要转
    • 如果最终要 json_encode() 后塞进 JS 变量:直接 json_encode($text, JSON_UNESCAPED_UNICODE),别自己拼字符串
    • 别手写正则匹配 ]+> —— 无法处理注释、CDATA、嵌套引号,还容易被绕过
    • 复杂 HTML 需要保留结构?用 DOMDocument 手动清理

      当你要保留 <p></p><ul></ul> 等语义标签,但删掉 <script></script><style></style> 和所有 onerrorhref="javascript:" 这类危险属性时,strip_tags() 就不够用了。

      DOMDocument 更可控,但要注意加载失败会报 Warning(比如遇到 malformed HTML),得提前 libxml_use_internal_errors(true) 抑制。

      • 创建文档:$dom = new DOMDocument(); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
      • 删 script/style:$scripts = $dom->getElementsByTagName('script'); while ($scripts->length) { $scripts->item(0)->parentNode->removeChild($scripts->item(0)); }
      • 遍历所有元素,清空危险属性:foreach ($dom->getElementsByTagName('*') as $el) { foreach (['onclick','onload','href','src'] as $attr) { if ($el->hasAttribute($attr)) { $el->removeAttribute($attr); } } }
      • 最后用 $dom->saveHTML() 输出 —— 注意它会自动补 ,可用 $dom->saveHTML($dom->documentElement) 取 body 内容

      为什么不用第三方库(比如 HTMLPurifier)?

      HTMLPurifier 功能最全,支持白名单、CSS 过滤、URI 校验,但体积大、初始化慢、配置复杂。如果你的项目只是做评论、简介这类简单富文本清洗,它属于「杀鸡用牛刀」。

      容易踩的坑是:把它当成黑盒调用,没配 $config->set('HTML.Allowed', 'p,b,i,a[href]'); 就直接 purify,结果默认策略极保守,连 <br> 都被删了。

      • 小项目、低流量:用 strip_tags() + htmlspecialchars() 组合足够
      • 中大型 CMS 或用户可发带图文章:值得引入 HTMLPurifier,但必须跑通配置测试,尤其检查 <img alt="php怎么过滤html标签 php字符串去除html代码【重点】" >src 是否允许相对路径、data URI
      • 别在循环里反复 new HTMLPurifier —— 实例可复用,否则性能暴跌
      实际过滤逻辑往往不是单点问题:输入来源、存储方式、输出上下文三者不一致,就容易漏掉某一层转义。最常被忽略的是「从数据库读出来后直接 echo 到 JS 字符串里」—— 那里既不是 HTML 上下文,也不是纯文本,htmlspecialchars() 无效,必须走 json_encode()

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    json数据格式
    json数据格式

    JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

    450

    2023.08.07

    json是什么
    json是什么

    JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

    546

    2023.08.23

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    326

    2023.10.13

    go语言处理json数据方法
    go语言处理json数据方法

    本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

    81

    2025.09.10

    if什么意思
    if什么意思

    if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

    839

    2023.08.22

    while的用法
    while的用法

    while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

    104

    2023.09.25

    php中foreach用法
    php中foreach用法

    本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

    202

    2025.12.04

    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    658

    2023.08.03

    Golang 测试体系与代码质量保障:工程级可靠性建设
    Golang 测试体系与代码质量保障:工程级可靠性建设

    Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

    48

    2026.02.28

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    相关下载

    更多

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    进程与SOCKET
    进程与SOCKET

    共6课时 | 0.4万人学习

    PHP自制框架
    PHP自制框架

    共8课时 | 0.6万人学习

    Swoft2.x速学之http api篇课程
    Swoft2.x速学之http api篇课程

    共16课时 | 1万人学习

    最新文章

    更多
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号