我希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号
但是在英文和汉字混合的情况下会出现如下问题:
如果有这样一个字符串
$str=这是一个字符串;
为了截取该串的前10个字符,使用
if(strlen($str)>10) $str=substr($str,10).…;
那么,echo $str的输出应该是这是一个字…
假设
$str=这是1个字符串;
这个串中包含了一个半角字符,同样执行:
if(strlen($str)>10) $str=substr($str,10);
由于原字符串$str的第10、11个字符构成了汉字“符”;
执行串分割后会将该汉字一分为二,香港服务器,香港服务器,香港虚拟主机,这样被截取的串就会发现乱码现象。
请问这种问题如何解决?即要使过长字符串实现分割,又不能让它发生乱码?
复制代码 代码如下:
$length)
{
$num=0;
for($i=0;$i{
if(ord($content[$i])>127)
{
$num++;
}
}
$num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
}
return $content;
}
?>
复制代码 代码如下:
function cutstr($string, $length, $dot = ' ...') {
$strcut = '';
for($i = 0; $i $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
}
return $strcut.$dot;
}
复制代码 代码如下:
function cuttitle($str, $len, $tail = ){
$length= strlen($str);
$lentail= strlen($tail);
$result= ;
if($length > $len){
$len = $len - $lentail;
for($i = 0;$i if(ord($str[$i]) $result .= $str[$i];
}else{
$result .= $str[$i];
++ $i;
$result .= $str[$i];
}
}
$result = strlen($result) > $len ? substr($result, 0, -2) . $tail : $result . $tail;
}else{
$result = $str;
}
return $result;
}
以下是一些补充:
1. 截取gb2312中文字符串
代码如下:
复制代码 代码如下:
0xa0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} else
$tmpstr .= substr($str, $i, 1);
}
return $tmpstr;
}
?>
2. 截取utf8编码的多字节字符串
代码如下:
复制代码 代码如下:
3. utf-8、gb2312都支持的汉字截取函数
代码如下:
复制代码 代码如下:
$sublen) return join('', array_slice($t_string[0], $start, $sublen))....;
return join('', array_slice($t_string[0], $start, $sublen));
}
else
{
$start = $start*2;
$sublen = $sublen*2;
$strlen = strlen($string);
$tmpstr = ''; for($i=0; $i{
if($i>=$start && $i{
if(ord(substr($string, $i, 1))>129)
{
$tmpstr.= substr($string, $i, 2);
}
else
{
$tmpstr.= substr($string, $i, 1);
}
}
if(ord(substr($string, $i, 1))>129) $i++;
}
if(strlen($tmpstr)return $tmpstr;
}
}$str = abcd需要截取的字符串;
echo cut_str($str, 8, 0, 'gb2312');
?>
4. bugfree 的字符截取函数
代码如下:
复制代码 代码如下:
=224 )
{
$stringtmp = substr($string,$i,3);
$i = $i + 3;
}
elseif( ord($stringtmp) >=192 )
{
$stringtmp = substr($string,$i,2);
$i = $i + 2;
}
else
{
$i = $i + 1;
}
$stringlast[] = $stringtmp;
}
$stringlast = implode(,$stringlast);
if($append)
{
$stringlast .= ...;
}
return $stringlast;
}
}$string = www.baidu.com;
$length = 18;
$append = false;
echo syssubstr($string,$length,$append);
?>