天天看点

自定义函数实现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);
 }
           

继续阅读