php 自带几种字符串截取函数,其中常用的就是 substr 和 mb_substr 。前者在处理中文时,gbk为2个长度单位,utf为3个长度单位。后者指定编码后,一个中文即为1个长度单位。
substr 不用说,有时会截1/3个中文或半个中文,当然现实出来乱码了,相对来说mb_substr 更适合我们使用。不过有时候mb_substr就显得不那么好用了。例如我要显示一个小图片的简要信息,5个中文正好,超过5个就截取前4再加上"...",这样处理中文是没问题,可是处理英文或数字,这样截取就太短了。
实例如下:
<?php
function g_substr($str, $len = 12, $dot = true) {
$i = 0; //$i起始截取位置,默认为0,中文utf-8,每次增加3,gbk,每次增加2 英文每次增加1
$l = 0; //$l的值随着截取自增加 中文增加2 英文增加1,这样就成了1个中文对2个英文的截取模式
$c = 0; //$c的值截取增加 中文utf-8增加3,gbk增加2 英文增加1
$a = array();
while ($l < $len) { //$l<$len就继续
$t = substr($str, $i, 1); //截取字符串 判断$t的ascii ord()转换为ascii编码
if (ord($t) >= 224) { //大于224 中文utf-8 一个汉字3个占字符
$c = 3;
$t = substr($str, $i, $c); //截取时,从起始位置往后截取3个字符
$l += 2;
} elseif (ord($t) >= 192) { //大于192 中文gbk 一个汉字2个占字符
$c = 2;
$t = substr($str, $i, $c); //截取时,从起始位置往后截取2个字符
$l += 2;
} else {
$c = 1;
$l++;
}
// $t = substr($str, $i, $c);
$i += $c; //起始位置变更,中文utf-8 增3,中文gbk 增2 英文 增1
if ($l > $len) break;
$a[] = $t; //赋值给数组
}
$re = implode('', $a); //转化为字符串
if (substr($str, $i, 1) !== false) { //判断$len长度后是否还有字符
array_pop($a); //删除数组的最后一位 适用于中文utf-8和gbk
($c == 1) and array_pop($a); //判断是否为英文 是英文的话在删除最后一位
$re = implode('', $a); //转换为字符串
$dot and $re .= '...';
}
return $re;
}
echo g_substr("xxxxxxxxxxxxxxxxxxxxxxx");
echo "<br/>";
echo g_substr("菠萝菠萝菠萝菠萝菠萝菠萝菠萝");