`
开源社交系统
  • 浏览: 3081 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ThinkSNS+ 是如何计算字符显示长度的

PHP 
阅读更多

什么是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,每日关注开发动态。)

开源不易,为了争取开源,我们团队做了很多努力。把基于Laravel的作品展示在大家面前,之后专栏会持续不断的分享ThinkSNS +开发过程中的技术细节。

分享到:
评论

相关推荐

    ThinkSNS + 移动端使用说明书1

    【ThinkSNS+ 移动端使用说明书】 ThinkSNS+ 是一款强大的社交网络软件,其移动端提供了丰富的功能,让用户可以在手机上轻松享受社区互动的乐趣。本说明书将详细介绍如何在移动设备上注册、登录、找回密码,以及使用...

    thinksns.zip_thinksns_thinksns+源码_thinksns源码

    这个标题“thinksns.zip_thinksns_thinksns+源码_thinksns源码”暗示了我们正在讨论的是ThinkSNS的源代码压缩包,包含完整的项目文件,可用于开发和定制。 1. **ThinkSNS系统概述**:ThinkSNS是一个基于PHP语言和...

    app端使用手册1

    本文档是对ThinkSNS+移动端使用说明的总结,涵盖了注册、登录、朋友圈、评论、点赞、收藏、分享、置顶、删除动态等多个方面的使用指南。 一、 注册/登录 注册是使用ThinkSNS+移动端的第一步,在注册过程中,用户...

    ThinkSNS2.0改进版代码包

    内置的超级管理员 ... 安装方法 - 程序包放入服务器 - 导入数据库文件ts_2_0.sql 新增加的功能 - 新浪式的两栏页面 - 新增举报功能 - 新增敏感词过滤功能 - 热门话题的自动生成+后台手动设置 ...- 完善微博广场(全新的UI...

    ThinkSNS V4 APPThinkSNS+ PC.rar

    《ThinkSNS V4 APP与ThinkSNS+ PC:一体化社交平台深度解析》 ThinkSNS V4 APPThinkSNS+ PC是一款集成了移动端APP和PC端应用的社交软件解决方案,旨在为企业和个人用户提供全面、高效且自定义化的社交网络服务。这...

    plus:PlusPlus(ThinkSNS +)是使用Laravel构建的功能强大且易于开发的社交系统

    加号(ThinkSNS +) 是使用框架开发;一个功能强大,易于开发和动态扩展的社交系统。加上是PSR规范代码统一,并功能块松连接。您安装完成Plus并不意味着已经成功安装了所有功能,因为Plus使用预设的原则,所以您安装...

    ts社交软件使用文档

    根据提供的文件内容,TS社交软件使用文档是一份详尽的指南,涵盖了ThinkSNS+这一社交网络平台的使用细节。ThinkSNS+是一个开源的社交平台,支持多平台部署,能够满足各种互联网平台的建设需求,例如社交网站、微博...

    THINK SNS源码

    4. `thinksns`目录:这个目录很可能包含了THINK SNS的全部源代码,包括PHP文件、静态资源(CSS、JavaScript、图片)、配置文件、模板文件等。开发者可以在这个目录下进行代码编辑、调试和自定义开发。 5. 版本迭代...

    微信小程序版使用手册1

    本使用手册将详细介绍如何有效地使用智艺创想科技有限公司开发的ThinkSNS+微信小程序。这款小程序集社交、资讯、互动功能于一体,为用户提供便捷的移动互联网体验。 1. 概述 ThinkSNS+微信小程序是一款基于微信平台...

    ThinkSNS与Ucenter的整合

    整合的验证阶段,检查ThinkSNS应用管理中的“通信状态”是否显示“通信成功”。然后在ThinkSNS首页注册一个新用户,若Ucenter的members表中出现该用户信息,那么表明ThinkSNS与Ucenter已经成功整合。 关于Ucenter...

    ThinkSNS免费

    至于压缩包中的“ThinkSNS”文件,这很可能是ThinkSNS平台的源代码包。安装和部署ThinkSNS通常包括解压文件、配置服务器环境、设置数据库连接、运行安装脚本等步骤。在这个过程中,开发者可以熟悉ThinkSNS的目录结构...

    ThinkSNS1.6源代码

    ThinkSNS基于许多优秀的开源软件开发,提供全方位的社交网络解决方案ThinkSNS源于办公圈项目,WEB端基于国内技术领先的ThinkPHP框架开发,另外还有IM客户端软件。 ThinkSNS全部基于开源项目,同时也作为开源项目,...

    IOS端使用手册1

    在智艺创想的ThinkSNS+平台上,iOS端的用户界面和功能设计旨在提供流畅、高效且直观的用户体验。本手册详细介绍了如何在iOS设备上充分利用ThinkSNS+的各项功能,无论您是初次接触还是资深用户,都能从中获取必要的...

    Thinksns的数据字典

    2. **字段描述**:每个表中包含的字段会被详细列出,包括字段名、数据类型、长度、默认值、是否允许为空等属性。这些信息对于理解数据如何存储、如何处理以及如何与其他表关联至关重要。 3. **键信息**:主键和外键...

    thinksns社交系统.zip

    《thinksns社交系统:构建高效互动平台的关键要素》 thinksns社交系统是一款专为构建社交网络平台设计的开源软件。它以其易用性、灵活性和强大的功能,深受开发者和小白用户喜爱。该系统提供了丰富的功能模块,使得...

    thinksns仿美丽说的花世界源码+旗舰版源码+瀑布流购物分享程序

    《基于Thinksns的“花世界”源码分析与应用》 在当今互联网技术日新月异的时代,社交网络和电子商务的结合已经成为一种趋势。"thinksns仿美丽说的花世界源码+旗舰版源码+瀑布流购物分享程序"提供了一套完整的解决...

    thinksns2.4

    《ThinkSNS 2.4:深度解析与技术探索》 ThinkSNS是一款基于PHP开发的社会化网络系统,它的核心在于构建社交网络平台,提供了一系列的功能模块,如用户管理、内容发布、互动交流等,旨在帮助企业或个人快速搭建具有...

    thinksns短信插件安装说明.zip

    《Thinksns短信插件安装指南详解》 在数字化时代,网站与用户的互动变得尤为重要,而短信服务作为其中的关键一环,能够实现验证码发送、密码找回等功能,提高用户体验。Thinksns短信插件就是为此目的设计的一款工具...

    ThinkSNS 1.6 ThinkSNS 1.6 ThinkSNS 1.6

    * 完整的产品构架、完善的基础应用、开箱即用。 * 内置API接口、后续支持自建平台、核心和应用分离。 * 完善的后台管理、可植入独立的应用管理。 * 正在完善IM应用,包括独立部署的WebIM和基于Air技术的客户端...

    thinksns常用手册

    它们支持多种字符编码,可以指定起始位置、截取长度,并且可以选择是否在截取后添加省略号作为后缀。 3. **rand_string()**:此函数用于生成指定长度的随机字符串,通常用于创建密码或者验证码。默认情况下,生成的...

Global site tag (gtag.js) - Google Analytics