这是因为汉字全角半角的问题,给你个函数:
function ChgTitle($title,$length){
if($length!=0){
if (strlen($title)>$length) {
$temp = 0;
for($i=0; $i<$length; $i++)
if (ord($title[$i]) > 128)
$temp++;
if ($temp%2 == 0)
$title = substr($title,0,$length)."...";
else
$title = substr($title,0,$length+1)."...";
}
return $title;
}else{return $title;}
}
function ChgTitle($title,$length){
if($length!=0){
if (strlen($title)>$length) {
$temp = 0;
for($i=0; $i<$length; $i++)
if (ord($title[$i]) > 128)
$temp++;
if ($temp%2 == 0)
$title = substr($title,0,$length)."...";
else
$title = substr($title,0,$length+1)."...";
}
return $title;
}else{return $title;}
}
if($length!=0){
if (strlen($title)>$length) {
$temp = 0;
for($i=0; $i<$length; $i++)
if (ord($title[$i]) > 128)
$temp++;
if ($temp%2 == 0)
$title = substr($title,0,$length).chr(0)."...";
else
$title = substr($title,0,$length+1).chr(0)."...";
}
return $title;
}else{return $title;}
}
//使用例子:
$aaa="在我记忆的脑海里,一份独特的珍藏,一份思念的眷恋,将是我生命历程的永远回味。十年前的今天我美好幸福的人生旅途瞬间画上了句号。我由一个娇媚的少妇,变成一名独自面对一切的坚强女人,成熟女人,肩负着重大责任的女人。是人生的坎坷让我脱胎换骨。 十年前的今天,也是一双休日,天很冷,你清晨就悄悄挪出温暖的被窝。做为电视新闻工作者的你,每次的双休日很少休息,为了全市人民能看上好的电视节目,你辛勤的努力着,流下很多的汗水,直到你永远离开我后,才在你的办公桌里看到你曾经受到省,地,市级各种奖励证书三十余本。我知道你是干事业的男人
";
trim($aaa);
$result=ChgTitle($aaa,40);//取40个字符,既20个汉字
echo $result;
function GetLocalSubstr($strSourceString, $intLong = -1, $charset="GB2312")
{
$strLenth = mb_strlen($strSourceString, $charset);
if($intLong == -1)
{
return $strSourceString
}
$intMaxCharLenth = 0;
for ($i = 0; $i < $strLenth; $i++)
{
$intMaxCharLenth = $intMaxCharLenth + strlen(mb_substr($strSourceString, $i, 1, $charset));
}
if($intLong < 0 || $intLong > $intMaxCharLenth)
{
return "";
}
$arrString = array();
$intCharLenth = 0;
$intDstPos = 0;
for ($i = 0; $i < $strLenth; $i++)
{
$arrString[$i] = mb_substr($strSourceString, $i, 1, $charset); if ($arrStringLenth[$i] == 1)
{
$intCharLenth = $intCharLenth + 1;
}
else
{
$intCharLenth = $intCharLenth + 2;
}
if($intCharLenth > $intLong)
{
$intDstPos = $i - 1;
break;
}
}
$strReturnValue = "";
for ($i = 0; $i <= $intDstPos; $i++)
{
$strReturnValue = $strReturnValue . mb_substr($strSourceString, $i, 1, $charset);
}
return $strReturnValue;
}
{
$totlelength = strlen($str);
//特例情况
if ($len == null) $len = $totlelength;
if ($len ==0) return "";
if ($len >= $totlelength && $start == 0 ) return $str;
if ($start > $totlelength) return ""; //分析$start
if ($start < 0 )//$start<0时,转化为$start>0时的定位.
{
if ( abs($start) >= $totlelength ) $start = 0;
else $start = $totlelength - abs($start);
}
//确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
if ($start > 0)
{
$i = $start-1; $flag = -1; while ($i >= 0)
{
if ( ord(substr($str,$i,1)) > 160)
{
$flag = -1*$flag;
}
else break;
$i--;
}
if($flag==1)
{
$start = $start - 1;
$len++; //保证不位移.
}
} $str = substr($str,$start);//截除字符串$str的$start位前的字符
$totlelength = strlen($str); //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
if ($len<0) $len = $totlelength - abs($len);
if ($len <= 0) return "";
$i=min($len,$totlelength);
$i--;
$flag = -1;
while ($i >= 0){
if (ord(substr($str,$i,1))>160){
$flag=-1*$flag;
}else break;
$i--;
}
if($flag == 1)$len=$len-1;
$subit=substr($str,0,$len);
return $subit;
}
在我记忆的脑海里,一份独特的珍藏,一份思...
2、其实
echo substr($aaa,0,40);
就是
在我记忆的脑海里,一份独特的珍藏,一份思
我的那个函数是为了在汉字字符串<=指定长度的时候正常显示,超过的部分用...代替
{
//一个汉字为2
$ch = chr(127);
$p = array("/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/","/[\x01-\x77]/");
$r = array("","");
if(func_num_args() > 2)
$end = func_get_arg(2);
else
$end = strlen($str);
if($start < 0)
$start += $end; if($start > 0) {
$s = substr($str,0,$start);
if($s[strlen($s)-1] > $ch) {
$s = preg_replace($p,$r,$s);
$start += strlen($s);
}
}
$s = substr($str,$start,$end);
$end = strlen($s);
if($s[$end-1] > $ch) {
$s = preg_replace($p,$r,$s);
$end += strlen($s);
}
return substr($str,$start,$end);
}function m_substr($str,$start)
{
//一个汉字为1
preg_match_all("/[\x80-\xff]?./",$str,$ar);
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return join("",array_slice($ar[0],$start,$end));
}else
return join("",array_slice($ar[0],$start));
}function m_strlen($str)
{
preg_match_all("/[\x80-\xff]?./",$str,$ar);
return count($ar[0]);
}