PHP获取中英混合字符串长度的方法


Posted in PHP onJune 07, 2014

今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。

$str = 'Hello world!';
echo strlen($str); // 输出12

然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。
$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18

而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:
$name = '张耕畅';
$len = strlen($name);
// 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len >= 3 && $len <= 8){
 echo 'TRUE';
}else{
 echo 'FALSE';
}

那么有什么方便而实用的方法可以获得含中文字符串的长度呢?可以用正则计算出中文字符的个数,在GBK/GB2312编码下除以2,UTF-8编码下则除以3,最后再加上非中文字符串的长度,但这样未免太过麻烦。

WordPress这么一段代码,借鉴如下:

$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]); // 输出9

思想是用正则表达式将字符串分割成单个字符,并直接用count计算出匹配到的字符数,便是我们想要的结果了。

但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:

$tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
 $str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);

可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。

以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:

int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] )

PHP 相关文章推荐
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
php addslashes 利用递归实现使用反斜线引用字符串
Aug 05 PHP
PHP实现模仿socket请求返回页面的方法
Nov 04 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
PHP获取远程http或ftp文件的md5值的方法
Apr 15 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 #PHP
PHP防止post重复提交数据的简单例子
Jun 07 #PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 #PHP
php 判断网页是否是utf8编码的方法
Jun 06 #PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 #PHP
php中数字0和空值的区别分析
Jun 05 #PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 #PHP
You might like
php安装swoole扩展的方法
2015/03/19 PHP
如何离线执行php任务
2017/02/21 PHP
php命令行写shell实例详解
2018/07/19 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
numpy.linspace函数具体使用详解
2019/05/27 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
暑假实习求职信范文
2013/09/22 职场文书
2013年高中生自我评价
2013/10/23 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
成都人事代理协议书
2014/10/25 职场文书
个人贷款收入证明
2014/10/26 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
Python实现生活常识解答机器人
2021/06/28 Python
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js
python中validators库的使用方法详解
2022/09/23 Python