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><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8961" title="html-to-pptx-converter"><img src="https://img.php.cn/upload/skill/000/000/081/179232667384043.jpg" alt="html-to-pptx-converter" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill8961" title="html-to-pptx-converter" class="overflowclass">html-to-pptx-converter</a> <p class="overflowclass">使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。</p> </div> <a rel="nofollow" href="/xiazai/skill8961" title="html-to-pptx-converter" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>'), 'UTF-8');→ 返回 4(“你好!”共 4 个字符)
保留标签结构但控制可见长度(安全截断用)
若需截取后仍输出合法 HTML(如新闻摘要),不能简单删标签,而要边解析边计数:
- 逐字符遍历,用状态机区分「标签内」和「文本内容」
- 仅在「文本内容」区累计 mb_strlen($char, 'UTF-8') == 1 的字符(跳过 `` `/` 等)
- 达到目标长度后,停止追加文本,但主动闭合已打开的标签(如遇到 `
` 就记下,最后补 `
`) - 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') 做主校验,数据库约束作兜底
不复杂但容易忽略:前端显示的「200 字简介」,后端必须按可见字符校验,而不是原始 HTML 字符数。否则一个 `
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










