php限制中英文混合的字符长度 | php限制留言字数

前端小白做留言板,限制了留言字数在30以内(随意的设定),某天无聊输入了30个中文字符发现留言失败,遂察觉到代码有漏洞。

当时验证留言字符长度的代码如下:

preg_match("/^.{1,30}$/", $user_mes)

结果只有当中文字符在10个及以内时才可成功留言

后来尝试了另外两种写法:

strlen($user_mes) < 31
!isset($user_mes{30})

也同样出现了上述情况

后来通过搜索浏览了博客园大佬void9main的一文:php使用strlen()判断中文汉字字符串长度 https://www.cnblogs.com/void9main/p/9705932.html
发现了问题所在:

PHP自带的函数如strlen()、mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节。而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8。utf-8能兼容更多的字符,所以受到很多站长的喜爱。gbk与utf-8对中文的编码不同,导致中文在gbk与utf-8编码下所占字节也有差异。gbk编码下每个中文字符所占字节为2,utf-8编码下每个中文字符所占字节为3。

简单地说就是在判别过程中,一个中文字符占了三个字符的位置,所以当我设置最多输入30个字符时,中文实际上是最多输入10个字符。

拉到文末(懒鬼本懒),发现了这句肥肠有用的话“iconv_strlen 是无论是何种编码,均能计算准确字符个数。”(如果没有它我也许还要摸爬滚打半天qwq感谢)

于是小机灵鬼我又搜索了一下iconv_strlen()函数
找到了一篇简单的博客,帮我解决了问题w
就是它:php 获得英文和中文混合的字数iconv_strlen https://blog.csdn.net/qq_20438233/article/details/44262621
感谢博主大大!

我的页面正好就是utf-9编码的,于是正好套用上,完美解决
最终的判别代码:

iconv_strlen($user_mes,"utf-8") < 31

放一张调(chou)皮(lou)的留言板截图
php限制中英文混合的字符长度 | php限制留言字数_第1张图片
就到这里叭!

你可能感兴趣的:(前端)