跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

php判断字符串长度包含html标签吗_php去标签测长度法【技巧】

strlen() 计算含HTML字符串时会将标签所有字符计入长度,如abc返回21;校验可读长度需先用strip_tags()剥离标签,再用mb_strlen(..., 'UTF-8')获取正确中文长度。 php
strlen()
会把 HTML 标签当普通字符算进去 直接用
strlen()
测含 HTML 的字符串,标签(比如

、
)每一个字符都计入长度。这意味着
abc
实际返回的是 21,而不是你想要的“可见文字长度” 3。 常见错误现象:表单限制 20 字,用户输入
你好
却被截断或报错——因为
strlen()
算了 13 个字符(含尖括号、斜杠、字母)。 如果你要校验用户可读内容长度(如评论、标题),必须先剥离标签
strlen()
快、无依赖,但纯看 字节 ,不理解 HTML 结构 注意:它对 UTF-8 中文也按字节算,
strlen("你好")
返回 6(每个中文 3 字节),不是 2 —— 这是另一个坑,和标签无关但常被混淆 用
strip_tags()
去标签再测长度最常用
strip_tags()
是 PHP 内置函数,能快速移除字符串中所有 HTML 和 PHP 标签,保留纯文本内容,适合大多数场景。 实操建议: 立即学习 “ PHP免费学习笔记(深入) ”; 基础用法:
strlen(strip_tags($html))
—— 但注意,这仍用
strlen()
,对中文不友好 更稳妥的中文长度判断:
mb_strlen(strip_tags($html), 'UTF-8')
,确保一个汉字算 1 个长度单位 想保留某些标签(如只允许

、

)?传第二个参数:
strip_tags($html, ['
', '

'])

(注意写法是数组,且标签需带
<>
) 它不会解析嵌套或畸形 HTML(如
),但日常富文本编辑器输出基本够用 为什么不用
html_entity_decode() + strip_tags()
组合? 有些内容里混着 HTML 实体(如
 
、
),strip_tags()
对它们无效——它只删标签,不转义实体。所以如果原始字符串是
"Hello  World"
,直接
strip_tags()
得到的是
"Hello  World"
,长度还是错的。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 这时需要先解码再剥离: 顺序不能错:必须
html_entity_decode($str, ENT_QUOTES | ENT_HTML5, 'UTF-8')
→
strip_tags()
→
mb_strlen(..., 'UTF-8')
ENT_HTML5
比默认的
ENT_COMPAT
更兼容现代 HTML 实体(如
'
) 注意:解码可能引入 XSS 风险,仅在你信任来源或后续还会过滤时使用;若只是测长度,且内容来自用户输入,建议先
strip_tags()
,再对结果做实体解码(更安全) 复杂 HTML(如 script/style/注释)要额外清理
strip_tags()
不处理
Hi
→
strip_tags()
后是
alert(1)Hi
→ 长度为 9,而非期望的 2。 解决方法有限但明确: 用正则粗筛(简单场景):
preg_replace('/<(script|style|textarea)[^>]*>.*?/is', '', $html)
,再配合
strip_tags()
删注释:
preg_replace('//', '', $html)
真正健壮的方案应使用 DOM 解析(如
DOMDocument
),但性能开销大,仅在高安全要求或结构复杂时值得投入 实际项目中,多数富文本字段已由 前端 editor(如 TinyMCE、Quill)做过基础清洗,后端重点防的是绕过前端的恶意提交——所以“strip_tags + 实体解码 + mb_strlen”覆盖了 95% 的真实需求。剩下那 5%,往往卡在 DOM 层级的嵌套逻辑或自定义标签上,得按需补正则或换解析器。

相关文章