摘要:今天我们来聊一下可能很多人都会头疼的东西显示长度。需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度。好在在无意间发现一个奇怪的东西这个函数计算非英文单词外是除了符号例如中文就是按照汉字个数算的,也是同理。
今天我们来聊一下可能很多人都会头疼的东西:显示长度。
需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度。如下:
上面排的是两个英文字母,一个汉字,一个Emoji。你会发现,在显示上占的宽度是一致的。一些设计上为了好看也要求有这样的处理。
例如,我们的用户名需求是最多12个非单字节字符或者24个单字节字符的需求也可以混合排的需求,我们写后端不得不处理这样的验证了。
需求规则是 /^a-zA-Z_x7f-xff*$/
在ThinkSNS+中,为了能把这部分验证公用,所以选择使用自定义验证规则。我们先说下计算的实现思路吧!
首先,就算是mb_strlen也没法准确的获取多字节字符和单子节字符混合在一起的长度,网上有个说法,汉字占三个字节,英文数组半角符号占一个字节,所以:
用这个方法可以得到单字节占0.5多字节占1的计算。但是以中文为例,只有两万个汉字才是这种情况,还有六万多汉字是四个,其次,emoji也是四个字节。根本无法准确的计算。
好在在无意间发现一个奇怪的东西str_word_count 这个函数计算非英文单词外是除了符号例如中文就是按照汉字个数算的,emoji也是同理。
发现这个以后,咱们就好办了。我们吧用户名中的 [a-aA-Z0-9_] 剔除掉,多带带计算不就是我们要的验证长度了吗?
所以,首先我们用:
方式多带带计算出单字节字符的显示长度,再用:
方式计算出多字节的长度,最后:
就得出了显示长度,实现了,最后封装成验证规则:
代码是原型代码,还没有进行优化,之后我们只要按照下面的方式用:
现在就很好的解决了这个需求。
我们很乐意,将基于 Laravel 的 ThinkSNS+ 产品开发中的技术解决方案分享给大家,也希望喜欢的朋友能给国内开源产品一点点的支持。
开源代码仓库GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)
官网:http://www.thinksns.com/
内测申请方式提供个人/企业联系方式及认证信息(真实姓名 /企业营业执照照片或扫描件)及申请说明,发送邮件至lihecong@zhishisoft.com将有机会获得首批内测资格,名额有限,申请从速。
开源不易,为了争取开源,我们团队做了很多努力。把基于Laravel的作品展示在大家面前,之后专栏会持续不断的分享ThinkSNS +开发过程中的技术细节
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/23074.html
摘要:本文主要全面讲解在不适用第三方包的情况下,如何在基于框架上,研发社交系统时,简历一套优雅而不失性价比的用户权限管理体系功能,内含真实代码。需求场景就是用户组权限节点,这个需求有很多很好的第三方包实现。但是已经足以胜任用户组权限判断逻辑了。 本文主要全面讲解在不适用第三方包的情况下,如何在基于Laravel框架上,研发社交系统ThinkSNS+时,简历一套优雅而不失性价比的用户权限管理体...
摘要:在社交系统中有这样一个命令主要是用作包的安装,升级,卸载。这在开发过程中很有用。内测申请方式提供个人企业联系方式及认证信息实名企业营业执照照片或扫描件及申请说明,发送邮件至将有机会获得首批内测资格,名额有限,申请从速。 在前面,我介绍了拓展类型,分别有 plus-compnent 和 plus-plugin 两个,这里重点讲以下如何实现 plus-component 的。 plus-c...
摘要:需求场景发送验证码或者消息通知,可发送到手机或邮箱中。完成首先,在中的规范就是使用的消息通知,这里基于场景为验证码。所以我们在验证码模型中添加是完全符合通知的正确使用的。 顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验。 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小...
阅读 2901·2021-11-24 09:39
阅读 3480·2021-11-22 13:54
阅读 3395·2021-11-16 11:45
阅读 2416·2021-09-09 09:33
阅读 3166·2019-08-30 15:55
阅读 1263·2019-08-29 15:40
阅读 906·2019-08-29 15:19
阅读 3372·2019-08-29 15:14