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