在PHP开发中,我们经常需要统计用户输入内容或者接口返回文本的长度,比如做字数限制、摘要截取等。当原始字符串里带有HTML标签时,直接用常规函数得到的长度并不是真正可见文字的长度,这会影响业务判断。

为什么直接判断字符串长度会包含HTML标签
PHP里的strlen函数用来获取字符串的字节长度,它并不会解析字符串内容,也不会区分哪些是标签、哪些是文字。例如字符串<p>你好</p>,其中的<p>和</p>都属于普通字符,会被一并计入。
如果页面编码是UTF-8,一个汉字通常占三个字节,而标签的英文字符每个占一个字节。使用strlen得到的是所有字节总和,既包含标签又包含文字编码字节,因此数值会明显大于我们肉眼看到的字数。要想拿到“纯文本字数”,必须先把标签去掉再做统计。
使用strip_tags去除HTML标签
strip_tags是PHP内置函数,作用是剥除字符串中的HTML和PHP标签,只保留标签之间的文本。它的第一个参数是原始字符串,第二个参数可指定允许保留的标签。对于字数统计场景,通常不需要保留任何标签。
需要注意的是,strip_tags只是简单删除尖括号及其中内容,不会处理实体编码如 ,也不会自动清理多余空白。如果原文标签嵌套不规范,也可能残留少量尖括号字符,因此去标签后最好配合trim清理两端空格。
<?php $html = '<div>欢迎访问<a href="https://ipipp.com">我们的网站</a><p>今日特惠</p></div>'; $text = strip_tags($html); $text = trim($text); echo $text; // 输出:欢迎访问我们的网站今日特惠 ?>
去标签后如何正确计算字符数
去除标签得到的纯文本,如果只包含英文,用strlen或mb_strlen差异不大;但包含中文时,必须指定编码用mb_strlen按字符计数。否则strlen会把中文按字节算,一个数字“长度”虚高。
下面示例展示对比:同一段中文去标签后,strlen得到字节数,mb_strlen得到真实字数。业务里做字数上限校验,应以mb_strlen为准。
<?php $html = '<span>文章内容示例</span>'; $text = strip_tags($html); $byte_len = strlen($text); $char_len = mb_strlen($text, 'UTF-8'); echo '字节长度:' . $byte_len . "n"; echo '字符长度:' . $char_len . "n"; // 字节长度可能为18,字符长度为6 ?>
常见误区与完整封装函数
有些开发者误以为trim或htmlspecialchars能去标签,其实前者只去空白,后者是把标签转义显示而非删除。正确做法永远是strip_tags加mb_strlen组合。
我们可以封装一个工具函数,统一处理去标签与统计,并预留允许保留的标签参数,方便不同业务复用。以下代码演示了带默认参数的安全写法。
<?php
function getPlainTextLength($str, $allowable_tags = '', $encoding = 'UTF-8') {
$text = strip_tags($str, $allowable_tags);
$text = trim($text);
return mb_strlen($text, $encoding);
}
$input = '<p>测试<b>加粗</b>内容</p>';
echo getPlainTextLength($input); // 输出纯中英文字符数
?>
不同场景下的选择建议
如果仅做数据库存储前的大致长度拦截,且内容以英文为主,去标签后用strlen也可接受;但若涉及用户前台展示字数、短信条数计算或中文社区发帖限制,务必使用mb_strlen。对于含富文本编辑器的系统,建议服务端校验与前端提示采用同一套去标签测长逻辑,避免不一致。
另外,当文本来自外部接口且可能包含脚本标签时,strip_tags也能顺带清除<script>降低存储风险,但正式防护还应配合更完善的过滤库。长度统计只是其中一环,不能替代安全处理。
| 函数 | 是否去标签 | 计数单位 | 适用场景 |
|---|---|---|---|
| strlen | 否 | 字节 | 底层字节判断 |
| strip_tags | 是 | 不计数 | 提取纯文本 |
| mb_strlen | 否 | 字符 | 多语言字数统计 |
php字符串长度strip_tags修改时间:2026-08-12 03:12:29