什么是ThinkSNS+

  ThinkSNS(简称TS),一款全平台综合性社交系统,目前最新版本为ThinkSNS+、ThinkSNS V4 ThinkSNS【简】。

今天我们来聊一下可能很多人都会头疼的东西:显示长度。

需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度。如下:

ab
哈
?

上面排的是两个英文字母,一个汉字,一个Emoji。你会发现,在显示上占的宽度是一致的。一些设计上为了好看也要求有这样的处理。

例如,我们的用户名需求是最多12个非单字节字符或者24个单字节字符的需求也可以混合排的需求,我们写后端不得不处理这样的验证了。

需求规则是  /^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/

在ThinkSNS+中,为了能把这部分验证公用,所以选择使用自定义验证规则。我们先说下计算的实现思路吧!

首先,就算是mb_strlen也没法准确的获取多字节字符和单子节字符混合在一起的长度,网上有个说法,汉字占三个字节,英文数组半角符号占一个字节,所以:

(mb_strlen($str) + strleng($str)) / 2

用这个方法可以得到单字节占0.5多字节占1的计算。但是以中文为例,只有两万个汉字才是这种情况,还有六万多汉字是四个,其次,emoji也是四个字节。根本无法准确的计算。

好在在无意间发现一个奇怪的东西str_word_count 这个函数计算非英文单词外是除了符号例如中文就是按照汉字个数算的,emoji也是同理。

发现这个以后,咱们就好办了。我们吧用户名中的 [a-aA-Z0-9_] 剔除掉,单独计算不就是我们要的验证长度了吗?

所以,首先我们用:

preg_match_all('/[a-zA-Z0-9_]/', $value, $single);
$single = count($single[0]) / 2;

方式单独计算出单字节字符的显示长度,再用:

$double = str_word_count(preg_replace('([a-zA-Z0-9_])', '', $value));

方式计算出多字节的长度,最后:

$length = $single + $double;

就得出了显示长度,实现了,最后封装成验证规则:

Validator::extend('display_length', function ($attribute, $value, array $parameters) {if (empty($parameters)) {throw new \InvalidArgumentException('Parameters must be passed');}$min = 0;if (count($parameters) === 1) {list($max) = $parameters;} elseif (count($parameters) >= 2) {list($min, $max) = $parameters;}if (! isset($max) || $max < $min) {throw new \InvalidArgumentException('The parameters passed are incorrect');}// 计算单字节.preg_match_all('/[a-zA-Z0-9_]/', $value, $single);$single = count($single[0]) / 2;// 多子节长度.$double = str_word_count(preg_replace('([a-zA-Z0-9_])', '', $value));// 得出最终计算字符的长度$length = $single + $double;return $length >= $min && $length <= $max;
});

代码是原型代码,还没有进行优化,之后我们只要按照下面的方式用:

$rules = ['inputKey' => 'display_length:5', // 表示 0 - 5 显示长度‘inputkey2’ => 'display_length:4,12' // 表示显示长度为 4 - 12
];

现在就很好的解决了这个需求。

我们很乐意,将基于 Laravel 的 ThinkSNS+ 产品开发中的技术解决方案分享给大家,也希望喜欢的朋友能给国内开源产品一点点的支持。

往期研发日记回顾:

《ThinkSNS+基于 Laravel master 分支【研发日记一】》

《ThinkSNS+研发中前端的抉择(webpack/Vue)踩坑日记【研发日记二】》

《基于 Laravel Route 的 ThinkSNS+ Component【研发日记三】》

《如何做到 Laravel 配置可以网站后台配置【研发日记四】》

开源代码仓库:

GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)

转载于:https://www.cnblogs.com/thinkSNS/p/11039482.html

ThinkSNS+ 是如何计算字符显示长度的相关推荐

  1. php求数组的长度的函数,php如何计算数组长度?

    php如何计算数组长度? 在PHP中,可以使用count() 或sizeof函数来获取数组中存在的元素的总长度或总数,计算数组长度. 方法一:count()函数 首先我们创建了一个数组,如下:$arr ...

  2. 简析ThinkSNS+ 计算字符显示长度的方法!【社交系统研发日记】

    今天我们来聊一下可能很多人都会头疼的东西:显示长度. 需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度.如下: 上面排的是两个英文字母,一个汉字,一个Emoji.你会发现, ...

  3. python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...

    如何在python列表中查找某个元素的索引 方法二:利用enumerate函数.没有任何一个男人,可以游手好闲赢得女人的欣赏. python dataframe中元素如何统计? 比如我有一个数据集a, ...

  4. m3u8合成视频 linux,m3u8文件什么合成便于播放的MP4的方法

    Using the Cordova Camera API 使用ionic开发一款android或ios应用,估计少不了使用到Camera API,这里记录下使用过程. 创建空的ionic应用 ioni ...

  5. 9月29日云栖精选夜读:武装到“牙齿”!阿里云发布史上最强企业云安全架构 11层防护...

    未来的企业都会基于云来搭建业务的安全系统,企业云安全架构(Cloud Security Compass)就是这么一份供上云企业参考的设计蓝图-- 企业可以像"建房子"一样,依据模块 ...

  6. 关于 Overtrue 的拼音库 overtrue/pinyin 为何 travis 为 error

    什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案. 1.png 这是 https://github.com ...

  7. [转]php获取含中文字符串长度

    本文转载自:http://vtrtbb.iteye.com/blog/607091 PHP计算字符串长度,包括计算英文.GBK.UTF-8多种字符集下PHP如何计算字符串长度.英文字符串长度 strl ...

  8. 字符串过长截断 html,(SqlServe)关于字符串长度被截断的问题

    1. 问题描述 在同步数据时常常会发现一个错误:将截断字符串或二进制数据. 2. 问题原因 这个问题出现的原因是:要插入的数值字段的长度超出了数据库中字段的长度.比如:插入的字符串字节长度是40,数据 ...

  9. php 字符串里面计算,php 计算字符串长度

    在项目的开发中,常常遇到要计算一个字符串的长度(中英文结合),由于产品要求不同,每个中文的长度要求也不一样. 解决utf-8编码下的字符串长度(可自定义每个中英文算几个字节) /** * 计算字符串长 ...

最新文章

  1. 查询表空间是否是设置了自增
  2. App推荐 | Google Tasks
  3. 基于WINCE6.0+S3C6410的背光驱动
  4. 正面管教之PHP_正面管教
  5. boost::compose_property_map相关的测试程序
  6. MATLAB加入螺旋相位板调制,平板式螺旋相位板的设计与应用
  7. [kubernetes] 证书详细总结
  8. 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能
  9. 农村70后、80后、90后的儿时玩具有哪些?
  10. 矩阵分析相关证明(一) —— 正交与投影
  11. html中ip输入格式正则表达式,通过正则表达式验证IP和端口格式的正确性
  12. python 实现数据化大屏_基于Python实现交互式数据可视化的工具(用于Web)
  13. 时间协议ntp服务器,时间服务器NTP搭建及NTP协议简介
  14. java郝斌_Java入门学习笔记-郝斌
  15. 对联广告php代码,css实现的对联广告代码
  16. tippy.js_Tippy.js的指令包装
  17. GOT10K toolkit的使用(python)
  18. 系统崩溃分析 - vmcore 加载到 Trace32
  19. matlab判断系统因果性,信号与系统如何判定一离散系统的因果稳定性
  20. 小白学react之页面BaseLayout框架及微信的坑

热门文章

  1. block(六)循环引用-b
  2. 介绍两个Eclipse插件: Implementors Call Hierarchy
  3. Nginx 作为web server 的优化要点
  4. 网站的安全证书存在安全问题,无继续浏览按钮
  5. openstack虚拟机内文件遭破坏的急救方案
  6. Dockefile CentOS SSH 服务的实现
  7. 神经网络理论基础及Python实现
  8. 北京驾照到期换证简记
  9. crontab工具类 断给定的时间 是否 满足 crontab 表达式.md
  10. [转] JSON转换