ThinkSNS特有需求之--英文字符占 0.5 个,中文字符占 1 个

ThinkSNS后端框架使用laravel,每周和 laravel master 保持同步,而后台和 html 5 则采用 vue 开发。语言特性方面,采用 php 7 的严格模式。
言归正传,之所以写继篇,其实是来检讨的,上一次发表了《ThinkSNS+ 如何计算字符显示长度》后,有网友几经测试后告知str_word_count 有问题。

根据ThinkSNS+ 的进度安排,最近在研发支付功能,所以只能使用周末的时间做了一个兼容性更好的计算方法。

需求

重新说下需求:在我天朝 PM 经常会提一种要求,就是例如一个用户名最多输入12个汉字,但是英文可以输入24个,混排也要满足这个规则。

简言之:单字节字符占0.5,多字节字符占1字节。

解决

闲下来的时候看了上篇文章中的算法,其实是没什么问题的,只是兼容性不够好,而且写那个方法时想得过于复杂

也不知道当时脑袋里面都想啥了

我们看上一篇中计算多字节的方法:

计算方法是剔除我们需求中允许的单字节,然后通过 str word count 来获取多字节的个数,其实这个函数是可以获取到的,但是部分系统下是不会成功的。还有一个函数就可以直接获取多字节的个数 mb strlen 修改后如下:

然后我们就可以正确完成这个需求了,最终实现的 Laravel 验证规则如下:

Laravel 通过上面的规则,可以在表单验证规则中直接验证,还支持传入最小值和最大值。

上面的代码都是来自于基于 Laravel 开发的开源程序 ThinkSNS+ 中,ThinkSNS+ 采用 apache-2.0 协议开源,我相信可以作为很多 Laravel 学习者的学习程序之一。

项目地址:GitHub: https://github.com/zhiyicx/thinksns-plus
(点击star关注研发动态,感谢大家的支持)

时间: 2024-12-21 00:39:04

ThinkSNS特有需求之--英文字符占 0.5 个,中文字符占 1 个的相关文章

xcode-如果第一个字符是0就删除

问题描述 如果第一个字符是0就删除 实现功能:如果UITextfield的第一个字符是0,就删除这个字符. 但是不知道怎么检测第一个字符的值,在删除第一个后应该再检测字符串中的下一个字符,也不知道应该怎么检测. 请高手帮忙一下.谢谢 解决方案 你应该是想实现这样的,是吧: if ([string hasPrefix:@"0"] && [string length] > 1) { string = [string substringFromIndex:1]; } 解

PHP实现通过中文字符比率来判断垃圾评论的方法_php技巧

本文实例讲述了PHP实现通过中文字符比率来判断垃圾评论的方法.分享给大家供大家参考.具体实现方法如下: 一.需求: 最近一段时间常常出现这类垃圾评论:一大段英文字符里夹杂一两个生僻汉字,包含了中文字符,而且又没包含啥中文的敏感词,所以就堂而皇之的通过了评论过滤.对这类评论的处理可以采取判断中文字符的比率来确认,但是也会存在一定的误判. 二.解决方案: 要用到php的两个函数strlen和mb_strlen,strlen会把单个汉字长度认定为3,mb_strlen单个汉字长度为1.同一段字符通过两

JavaScript如何判断字符串长度(英文占1个字符,中文汉字占2个字符)

//计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; i<this.length; i++) { if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { len += 2; } else { len ++; } } return len; } 方法二: function strlen(str){

JS判断字符串长度(英文占1个字符,中文汉字占2个字符)

//计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; i<this.length; i++) { if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { len += 2; } else { len ++; } } return len; } 方法二: function strlen(str){

c++统计用户输入的字符串的空格字符,英文字符,数字个数,其他字符个数以及用户输入字符串的长度

问题描述 c++统计用户输入的字符串的空格字符,英文字符,数字个数,其他字符个数以及用户输入字符串的长度 我在统计中文的时候出现了问题,请各位大神指教一下 #include #include using namespace std; int main() { string str; cout << "请输入一个字符串,以换行为结束!n"; getline(cin, str); size_t count = 0; size_t spaceNum=0; size_t lette

Java中文字符所占的字节数

Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节:采用GB2312或GBK编码方式时,一个中文字符占2个字节:而采用UTF-8编码方式时,一个中文字符会占3个字节.我们可以通过String类的getBytes(String charsetName)方法来获取到字符串以指定编码方式编码后所得到的字节数组,然后字节数组的长度就是该字符串在指定编码方式下所占的字节数.下面为一个测试示例: public s

datagridview-怎么删除DATAGRIDVIEW中字符为“0:00:00”的行

问题描述 怎么删除DATAGRIDVIEW中字符为"0:00:00"的行 要把某一列中含有字符"0:00:00"的行全部删除,出错了,请大家指正或者更好的方法.谢谢 解决方案 你可以直接从数据源判断,如果某条数据的Minimun knit time的值为0:0:0,则绑定该记录或者从数据源中移除该记录,再绑定. 解决方案二: 你的错是索引超出,看看访问Rows或Cell的索引对不对 解决方案三: 数据源是直接从CSV格式导入到DATAGRIDVIEW的,如果是在SQ

struts2.0-跪求各位大神帮助啊,Struts2文件下载GG,有中文字符的文件下载就出错,英文就不出错,求救

问题描述 跪求各位大神帮助啊,Struts2文件下载GG,有中文字符的文件下载就出错,英文就不出错,求救 本人小白,文件上传木有问题,下载英文字符文件名的文件也木有问题,就是中文字符名称的文件就GG了,跪求各位大神指点 解决方案 private static final long serialVersionUID = 1L; //文件路径 private String filePath; //文件名称 private String fileName; public String getFileP

数据智能需求旺盛 阿里云MaxCompute2.0华南区开服

本文讲的是数据智能需求旺盛 阿里云MaxCompute2.0华南区开服 [IT168 资讯]8月31日,阿里云宣布将在深圳区域正式部署大数据计算服务MaxCompute,以进一步提升对华南区域客户服务的响应速度,并推动该地域人工智能产业的发展. 此前,凭借大规模计算存储.多种计算模型.强数据安全和低成本的优势,MaxCompute一直供不应求. 官方预计,深圳区域将于9月7日正式开放售卖,此后阿里云MaxCompute还将在年底前陆续新开北京.杭州.香港.新加坡.美国.日本.欧洲等节点.这显示了