if(!function_exists('cn_substr')){
function cn_substr($string='',$start=0,$length=0,$lang='gbk'){
switch($lang){
case 'gbk':$step = 1;break;
case 'utf-8';$step = 2;break;
default:$step = 2;break;
}
$result = '';
$stringlength = strlen($string);
$length = intval($length);
$start = intval($start);
if($length==0||$stringlength<$start+1){
return '';
}
$index = 0;
for($i=0;$i<$stringlength;$i++){
$char = '';
if($length){
if(ord($string[$i])>0x80){
for($j=$i;$j<=$i+$step;$j++){
$char .= $string[$j];
}
$i+=$step;
}else{
$char = $string[$i];
}
$index++;
if($index>=$start){
$length--;
$result .= $char;
}
}else{
break;
}
}
return $result;
}
}
echo cn_substr('left花衣', 1, 4);
在 PHP 中,我们直接使用PHP strlen函数进行字符串截取,对于英文字符,没有什么区别,输出的结果都是一样的,而在截取中文时,却有一点小小的问题,我们知道,字符分为两种状态,一种是 gbk 字符串,另一种就是 utf-8 字符串,如果按照常规的输出方法,输出的结果是不一样的。
php strlen 函数最基本的参数有 str 字符串,len 长度,start 开始位置,如果截取的字符串 gbk 格式,那么 len 的步长为 1,截取“夏日博客”,只取前两个字符,输出就是“夏日”,而截取的字符串类型是 utf-8 格式的话,那么 len的步长则为 2,输出的结果为“夏日博”,这也就是两种格式输出不一样的原因。
简要说明一下截出输入的步长,以“夏日博客”为例,步长从 0 开始,从开始的“夏”之前开始算起,第一步为0,则“夏”之后为第二步为 1,依此类推。
依照上述原理,我们可以写一个同时支持截取 gbk 和 utf-8 字符的函数,如下:
------------------------------------------------------------------------
cn_substr 只支持utf-8
substr()函数中文版 普通的substr()函数可以取得字符串的指定长度子字符串,但遇到中文时可能会在新字符串末尾产生乱码,下面这个函数将超过$len长度的字符串转换成以“...”结尾,并且去除了乱码。
用法:$new =
substr($old,20);
function cn_substr($str,$len)
{
$end = $len=0 AND $i <$end)
{
if(ord(substr($str,$i,1)) > 0xa1)
$result_str.=substr($str,$i,2);
else
$result_str.=substr($str,$i,1);
}
if(ord(substr($str,$i,1)) > 0xa1)
$i++;
}
return $result_str;
if(strlen($str)<=$end)
return $result_str;
else
return $result_str."...";
}
function sub_str($str, $length = 0, $append = true)
{
$str = trim($str);
$strlength = strlen($str);
if ($length == 0 || $length >= $strlength)
{
return $str; //截取长度等于0或大于等于本字符串的长度,返回字符串本身
}
elseif ($length < 0) //如果截取长度为负数
{
$length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度
if ($length < 0)
{
$length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度
}
}
if (function_exists('mb_substr'))
{
$newstr = mb_substr($str, 0, $length, EC_CHARSET);
}
elseif (function_exists('iconv_substr'))
{
$newstr = iconv_substr($str, 0, $length, EC_CHARSET);
}
else
{
//$newstr = trim_right(substr($str, 0, $length));
$newstr = substr($str, 0, $length);
}
if ($append && $str != $newstr)
{
$newstr .= '...';
}
return