今天要说的是一个可能让很多人头疼的问题:显示长度。要求是这样的。在字符的显示上,只有两个英文单词就占了一个中文或其他语言的显示长度。如下:最上面一排是两个英文字母,一个汉字,一个Emoji。你会发现显示的宽度是一样的。一些设计也需要这样的处理才能看起来不错。比如我们的用户名要求是最多12个非单字节字符或者24个单字节字符,也可以混合要求。我们必须在后端处理这样的验证。需求规则为/^a-zA-Z_x7f-xff*$/在ThinkSNS+中,为了将这部分验证公开,选择使用自定义验证规则。先说计算思路的实现吧!首先,即使是mb_strlen也不能准确获取多字节字符和单字节字符混合的长度。网上有种说法,汉字占三个字节,英文数组半角符号占一个字节,所以:用这个方法可以得到单个字节占0.5,多个字节占1的计算。但是取中文举个例子,只有两万个汉字是这样,四个字的汉字就有六万多个。其次,emoji也是四个字节。无法准确计算。幸运的是,我无意中发现了一件奇怪的事情。str_word_count此函数计算除符号外的非英语单词。比如中文是按照汉字的个数来统计的。表情符号也是如此。一旦我们发现了这一点,我们就会没事的。我们把用户名去掉[a-aA-Z0-9_],不就是我们要单独计算的验证长度吗?所以,首先我们使用:方法分别计算单字节字符的显示长度,然后使用:方法计算多字节字符的长度,最后:获取显示长度,实现,最后封装成一个验证规则:代码为原型代码没有优化,我们只需要按如下方式使用即可:现在这个需求很好解决了。很高兴与大家分享基于Laravel的ThinkSNS+产品开发中的技术方案,希望喜欢的朋友能对国产开源产品给予一点支持。开源代码仓库GitHub:https://github.com/zhiyicx/thinksns-plus(点击star每天关注发展动态。)官网:http://www.thinksns.com/内测报名方式 提供个人/企业联系方式及证明资料(实名/营业执照照片或扫描件)及报名须知,发送邮件至lihecong@智世软件将有机会获得首批内测资格,名额有限,请从速申请。开源并不容易。为了争取开源,我们团队做了很多努力。将基于Laravel的作品展示在大家面前,之后专栏会继续分享ThinkSNS+开发过程的技术细节
