PHP正确统计中文字数以及截取字符串给超出的部分打点

11266次阅读 418人点赞 作者: WuBin 发布时间: 2021-04-29 14:11:19
扫码到手机查看

许多的统计字数方法

PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了strlenmb_strlenmb_strwidth这个三个函数去测试统计字符串的长度,看看把中文算成几个字节:

echo strlen("你好ABC123") . "";  //输出 12
echo mb_strlen("你好ABC123", 'UTF-8') . "";  // 输出 8
echo mb_strwidth("你好ABC123") . "";  //输出 10

从上面的测试,我们可以看出:

  • strlen把中文字符算成 3 个字节,数字字母算一个字节;
  • mb_strlen不管中文还是英文数字,都算 1 个字节;
  • mb_strwidth则把中文算成 2 个字节,所以mb_strwidth才是我们想要的:中文 2 个字节,英文 1 个字节,数字一个字节;
所以根据实际情况,当需要把中文、英文、数字一视同仁,都算作一个字节的情况下,使用mb_strlen无疑是最合适的。比如在录入文章概要、描述等地方,非常适合。
strlen就比较适合纯英文与数字环境下,检测字符串的长度。

超出字数显示...

截取字符串也建议使用mb_strimwidth,也是按照 中文 2 个字节,英文 1 个字节 方式计算之后的,并且如果字数超过截取的要求,这个函数还可以在最后面自动添加‘…’。
mb_strimwidth—获取按指定宽度截断的字符串, 按width将字符串str截短。(PHP>=4)
mb_strimwidth(string$str,int$start,int$width,string$trimmarker= "",string$encoding= mb_internal_encoding()) :string
str: 要截短的string。
start: 开始位置的偏移。从这些字符数开始的截取字符串。(默认是 0 个字符) 如果 start 是负数,就是字符串结尾处的字符数。
width: 所需修剪的宽度。负数的宽度是从字符串结尾处统计的。
trimmarker: 当字符串被截短的时候,将此字符串添加到截短后的末尾。
encoding: encoding参数为字符编码。如果省略或是null,则使用内部字符编码。
返回值:截短后的string。 如果设置了trimmarker,还将结尾处的字符替换为trimmarker,并符合width的宽度。【包含...在内一共width个数!】
$text = 'this is my house! i love u';
$new = mb_strimwidth($text, 0, 10, '...', 'utf-8');
echo $new;
// 输出:this is...  包含空格 字母以及...一共10个字符长度
$text = '我是武斌,i am a web worker!';
$new = mb_strimwidth($text, 0, 11, '...', 'utf-8');
echo $new;
// 输出:我是武斌...  每个汉字=2个字节长度 + 3个点 2 * 4 + 3 = 11

注意,最后添加‘utf-8’编码参数,可以避免中文截取乱码的问题。mb_strlen和mb_strimwidth都是如此!

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:mb_strlenmb_strwidth
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9094次阅读 588人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3843次阅读 286人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14071次阅读 914人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12908次阅读 442人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11469次阅读 920人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15588次阅读 1244人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14795次阅读 1205人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    28950次阅读 2273人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    24982次阅读 1925人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录