php截取字符串之截取utf8或gbk编码的中英文字符串示例

 更新时间:2014年03月12日 11:06:03   作者:  
php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求,下面给大家提供一个方法来完成这样的功能
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

微博的发言有字数限制,其计数方式是,中文算2个,英文算1个,全角字符算2个,半角字符算1个。
php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求。
mb_strlen 可以根据字符集计算长度,比如utf8的中文计数为1,但这不符合微博字数限制需求,中文必须计算为2才可以。
google了下,找到一个discuz中截取各种编码字符的类,改造了下,已经测试通过.其中参数$charset 只支持gbk与utf-8。

复制代码 代码如下:

$a = "s@@你好";
var_dump(strlen_weibo($a,'utf-8'));

结果输出为8,其中字母s计数为1,全角@计数为2,半角@计数为1,两个中文计数为4。源码如下:

复制代码 代码如下:

function strlen_weibo($string, $charset='utf-8')
{
    $n = $count = 0;
    $length = strlen($string);
    if (strtolower($charset) == 'utf-8')
    {
        while ($n < $length)
        {
            $currentByte = ord($string[$n]);
            if ($currentByte == 9 ||
                $currentByte == 10 ||
                (32 <= $currentByte && $currentByte <= 126))
            {
                $n++;
                $count++;
            } elseif (194 <= $currentByte && $currentByte <= 223)
            {
                $n += 2;
                $count += 2;
            } elseif (224 <= $currentByte && $currentByte <= 239)
            {
                $n += 3;
                $count += 2;
            } elseif (240 <= $currentByte && $currentByte <= 247)
            {
                $n += 4;
                $count += 2;
            } elseif (248 <= $currentByte && $currentByte <= 251)
            {
                $n += 5;
                $count += 2;
            } elseif ($currentByte == 252 || $currentByte == 253)
            {
                $n += 6;
                $count += 2;
            } else
            {
                $n++;
                $count++;
            }
            if ($count >= $length)
            {
                break;
            }
        }
        return $count;
    } else
    {
        for ($i = 0; $i < $length; $i++)
        {
            if (ord($string[$i]) > 127)
            {
                $i++;
                $count++;
            }
            $count++;
        }
        return $count;
    }
}

相关文章

  • PHP中的运算符使用示例详细指南

    PHP中的运算符使用示例详细指南

    这篇文章主要为大家介绍了PHP中的运算符使用示例详细指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Laravel实现数据库迁移与支持中文的填充

    Laravel实现数据库迁移与支持中文的填充

    最近在学习Laravel数据库方面的内容,发现了一些资料不错整理出来分享给大家,下面这篇文章主要给大家介绍了关于Laravel实现数据库迁移与支持中文填充的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-11-11
  • php图片裁剪函数

    php图片裁剪函数

    这篇文章主要为大家详细介绍了php图片裁剪函数,图片裁剪工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • php之header的不同用法总结(实例讲解)

    php之header的不同用法总结(实例讲解)

    下面小编就为大家分享一篇php之header的不同用法总结(实例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • 在VS?Code?中调试远程服务器的PHP代码详解

    在VS?Code?中调试远程服务器的PHP代码详解

    这篇文章主要介绍了在VSCode中调试远程服务器的PHP代码,这里通过xdebug配合vscode的php?debug插件来实现,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 百度实时推送api接口应用示例

    百度实时推送api接口应用示例

    这篇文章主要介绍了百度实时推送api接口应用示例,非常的实用,有需要的朋友可以参考下
    2014-10-10
  • Smarty模板常见的简单应用分析

    Smarty模板常见的简单应用分析

    这篇文章主要介绍了Smarty模板常见的简单应用,结合实例形式分析了Smarty模板的引入、创建、设置及相关的常见使用技巧,需要的朋友可以参考下
    2016-11-11
  • php预定义变量使用帮助(带实例)

    php预定义变量使用帮助(带实例)

    php取得外部变量的首选方法是用下面提及的超全局变量。在此之前,人们要么依赖 register_globals,要么就是长长的预定义 PHP 数组($HTTP_*_VARS)。自 PHP 5.0.0 起,长格式的 PHP 预定义变量可以通过设置 register_long_arrays 来屏蔽。
    2013-10-10
  • PHP小程序后台部署运行 LNMP+WNMP的方法

    PHP小程序后台部署运行 LNMP+WNMP的方法

    这篇文章主要介绍了PHP小程序后台部署运行 LNMP+WNMP的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • php的Snoopy类案例讲解

    php的Snoopy类案例讲解

    这篇文章主要介绍了php的Snoopy类案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论

?


http://www.vxiaotou.com