PHP 7.4 中判断含 HTML 字符串的可见长度,应先用 strip_tags() 剥离标签,再用 mb_strlen(..., 'UTF-8') 计算真实可读字符数;若需保留合法 HTML 结构,则须状态机安全截断并闭合标签。

PHP 7.4 中判断含 HTML 标签的字符串长度,关键不是「总字符数」,而是「用户实际看到的文本长度」——即跳过所有 HTML 标签,只统计可见文字(包括中文、emoji、空格、标点),同时避免因截断导致标签结构损坏。直接用 strlen() 或 mb_strlen() 对原始 HTML 字符串测长,会把 `
`、``、`style="..."` 等全部算进去,结果远大于真实阅读长度,完全不可用于摘要、预览或字数限制场景。
只计可见文本长度(推荐:先剥离再测)
最稳妥的做法是先去除 HTML 标签,再按 UTF-8 字符计数:
- 用 strip_tags($html) 去掉所有标签,保留纯文本(注意:它不会解析实体,如
&仍为 4 字符;若需转义还原,加html_entity_decode()) - 用 mb_strlen(strip_tags($html), 'UTF-8') 获取真实可读字符数
- 示例:
$visibleLen = mb_strlen(strip_tags('<p>你好!</p>'), 'UTF-8');→ 返回 4(“你好!”共 4 个字符)
保留标签结构但控制可见长度(安全截断用)
若需截取后仍输出合法 HTML(如新闻摘要),不能简单删标签,而要边解析边计数:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 逐字符遍历,用状态机区分「标签内」和「文本内容」
- 仅在「文本内容」区累计 mb_strlen($char, 'UTF-8') == 1 的字符(跳过 `` `/` 等)
- 达到目标长度后,停止追加文本,但主动闭合已打开的标签(如遇到 `
` 就记下,最后补 `
立即学习“PHP免费学习笔记(深入)”;
`) - PHP 7.4 原生无内置函数实现此逻辑,需手写或使用成熟库(如
HTMLPurifier的截断扩展)
数据库或 API 场景下的长度校验要点
若 HTML 字符串来自表单提交或 JSON 接口,还需防编码污染:
- 接收后立刻用 mb_check_encoding($html, 'UTF-8') 验证是否真为 UTF-8,否则
mb_*函数可能误判 - 入库前检查字段定义(如
VARCHAR(500)+utf8mb4),确认 500 是字符上限而非字节上限 - 对富文本字段,建议在业务层用
mb_strlen(strip_tags($input), 'UTF-8') <= 500做主校验,数据库约束作兜底
不复杂但容易忽略:前端显示的「200 字简介」,后端必须按可见字符校验,而不是原始 HTML 字符数。否则一个 `


















