判断有没有汉字:
preg_match("/[\x{4e00}-\x{9fa5}]/u", $string)
\x4e00-\x9fa5是汉字unicode的十六进制范围
http://www.shuihan.com/article/146
\x4e00-\x9fa5是汉字unicode的十六进制范围
http://www.shuihan.com/article/146
打开这个隐藏部分
/***************************************************************************
函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字
$str------------截取源字符串
$start----------起始位置,不能为空,从1算起
$len------------截取长度(2代表一个汉字),如果为空则截取到字符串末尾
主意:该函数不能用于utf8编码字符串,会出现乱码
***************************************************************************/
function substr_for_gb2312($str,$start,$len=null)
{
$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;
}
/***************************************************************************
函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字
$str------------截取源字符串
$len------------截取长度(2代表一个汉字)
主意:该函数不能用于utf8编码字符串,会出现乱码
***************************************************************************/
function splitStr($str,$len)
{
if($len<=0)
{
return false;
}
else
{
$sLen=strlen($str);
if($len>=$sLen)
return $str;
else
{
for($i=0;$i<($len-1);$i++)
{
if(ord(substr($str,$i,1))>0xa0)
$i++;
}
if($i>=$len)
return substr($str,0,$len);
elseif(ord(substr($str,$i,1))>0xa0)
return substr($str,0,$len-1);
else
return substr($str,0,$len);
}
}
}
/***************************************************************************
函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字
$sourcestr------------截取源字符串
$cutlength------------截取长度(字数)
这个函数很万能,但是相对前两个耗资源一些
***************************************************************************/
function substr_for_utf8($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr); //字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码
if ($ascnum>=224) //如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum>=192)//如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
}
elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else //其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length>$cutlength)
{
$returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
}
return $returnstr;
}
?>