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

来源:互联网 发布:服务器端口转发工具 编辑:程序博客网 时间:2024/05/22 00:34

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); }


原创粉丝点击