找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 452|回复: 0
打印 上一主题 下一主题

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

[复制链接]

3444

主题

3465

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11142
跳转到指定楼层
楼主
发表于 2018-2-14 05:58:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。
[U]复制代码[/U] 代码如下:
$str = 'Hello world!';
echo strlen($str); // 输出12
然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。
[U]复制代码[/U] 代码如下:
$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18
而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:
[U]复制代码[/U] 代码如下:
$name = '张耕畅';
$len = strlen($name);
// 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len >= 3 && $len
那么有什么方便而实用的方法可以获得含中文字符串的长度呢?可以用正则计算出中文字符的个数,在GBK/GB2312编码下除以2,UTF-8编码下则除以3,最后再加上非中文字符串的长度,但这样未免太过麻烦。
WordPress这么一段代码,借鉴如下:
[U]复制代码[/U] 代码如下:
$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]); // 输出9
思想是用正则表达式将字符串分割成单个字符,并直接用count计算出匹配到的字符数,便是我们想要的结果了。
但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:
[U]复制代码[/U] 代码如下:
$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编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。
以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:
[U]复制代码[/U] 代码如下:
int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] )
            
            
您可能感兴趣的文章:
  • PHP 中英文混合排版中处理字符串常用的函数
  • php strlen mb_strlen计算中英文混排字符串长度
  • php中计算中文字符串长度、截取中文字符串的函数代码
  • 使用php统计字符串中中英文字符的个数
  • PHP字符串长度计算 - strlen()函数使用介绍
  • PHP 字符串长度判断效率更高的方法
  • php截取字符串之截取utf8或gbk编码的中英文字符串示例
  • php轻松实现中英文混排字符串截取
  • 利用PHP函数计算中英文字符串长度的方法
  • PHP判断字符串长度的两种方法很实用
  • PHP指定截取字符串中的中英文或数字字符的实例分享
  • PHP针对中英文混合字符串长度判断及截取方法示例
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端