天天看點

自定義函數實作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);
 }
           

繼續閱讀