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 相关文章推荐
php基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP5 面向对象(学习记录)
Dec 02 PHP
Zend Framework页面缓存实例
Jun 25 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
详细解读php的命名空间(二)
Feb 21 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版(5)
2006/10/09 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP进程同步代码实例
2015/02/12 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
php接口技术实例详解
2016/12/07 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python 内置函数filter
2017/06/01 Python
对Python中的@classmethod用法详解
2018/04/21 Python
python批量修改文件编码格式的方法
2018/05/31 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Django之模板层的实现代码
2019/09/09 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
专升本自我鉴定
2013/10/10 职场文书
网络编辑职责
2014/03/01 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python