自定义函数实现mb_strlen与中文 strrev转置功能

mb_strlen 功能:获取字符串长度,主要是指非ascii编码的字符串。

代码:

<?php
$str = '北京1你好abc';
function my_strlen($str) {
    $i = 0;
    $count = 0;
    $len = strlen($str);
    while ($i < $len) {
        $chr = ord($str[$i]);
        $i++;
        $count++;
        if ($chr & 0x80) {
            $chr <<= 1;
            //此处使用的原理为utf-8格式编码决定的。
            //当字节的第一位为0 则表示该字符为单字节文字,即ascii,  后面有多少个1就表示字符占用多少个字节。。
            while ($chr & 0x80) {
                $i++;
                $chr <<= 1;
            }
            echo '$i = ' . $i, "\n";
        }
    }
    return $count;
}

主要实现原理采用的是utf-8格式编码的规则。

如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

另外还可以使用正则表达式的方式实现。

<?php
$str = '北京1你好abc';
function my_strlen($str) {
    return count(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY));
}
echo my_strlen($str), "\n";

strrev 功能:反转字符串

当使用strrev时,如果是英文字符反转功能正常 ,而中文字符会出现乱码。 而mb库中并没有相应的处理方式。

我们需要手动实现一个,

方法1, 使用正则表达式,分割字符串 进行转置。

$arr = preg_split('//u', $str);

$arr = array_reverse($arr);

$str = join('', $arr);


方法2. 使用上一个原则的特点 自定义函数

function mb_strrev($str)
{
    $length = strlen($str);
    $returnStr = [];
    for ($i = 0; $i < $length; $i++)
    {
        $chr = ord($str[$i]);
        if ($chr & 0x80)
        {
            $chr <<=1;
            $j = 0;
            while ($chr & 0x80) {
                $j++;
                $i++;
                $chr <<= 1;
            }
            for ($k = 0; $k <= $j; $k++)
            {
                array_unshift($returnStr, $str[$i - $k]);
            }
        } else {
            array_unshift($returnStr, $str[$i]);
        }
    }
    return join('', $returnStr);
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值