string mb_substr ( string str, int start [, int length [, string encoding]] ) 参数:要截取的字符串,开始位置,长度(可省略),编码(可省略)mb_substr() returns the portion of str specified by the start and length parameters.
如果mysql是4.1以上,设置了character set为gb2312或utf8的话,直接 select left(title,4) from .... 这样就可以截取4个字符(包括中文和英文,一个中文作为一个字符计算)
$str="精美!海豚里的世界屏保" 只是举的例子.
$substr=get_valid_q($str,12);
//取汉字函数,防止取半个字符
function get_valid_q($q,$length){
if(strlen($q)<=$length) return $q;
else {
$temp=0;
for($i=0; $i<$length; $i++){
if (ord($q[$i]) > 128)
$temp++;
}
if ($temp%2 ==0) $q = substr($q,0,$length);
else $q = substr($q,0,$length+1);
return $q;
}
}
两个高效的函数:c_substr、m_substr。他们的用法完全与substr和mb_substr相同。不同之处在于:c_substr按字节计算,即一个汉字的长度为2;m_substr按字计算,即一个汉字的长度为1。可根据需要选用。function c_substr($str,$start=0) {
$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) {
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));
}
参数:要截取的字符串,开始位置,长度(可省略),编码(可省略)mb_substr() returns the portion of str specified by the start and length parameters.
select left(title,4) from ....
这样就可以截取4个字符(包括中文和英文,一个中文作为一个字符计算)
$break_words = false, $middle = false)
{
if ($length == 0)
return ''; if (strlen($string) > $length) {
$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length).$etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}具体使用,自己改一下,我一直用的函数。
echo substrs($str,12);function substrs($content,$length) {
if($length && strlen($content)>$length){
$num=0;
for($i=0;$i<$length-3;$i++) {
if(ord($content[$i])>127){
$num++;
}
}
$num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
$content.='..';
}
return $content;
}
chaoliu1(潮流) ( ) 信誉:100 Blog 的方法已经可以了
{
for($i = 0;$i <$end;$i++)
{
if ($i >=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++;
}
if(strlen($str)<=$end)
return $result_str;
else
return $result_str."...";
}
从去年开始,substr函数已经很久没出现过截取中文乱码问题了,不过条件是从0开始,如:
substr($str,0,13);
不过你的程序好象是从0开始的,那么要检查一下你的php版本了,php5没问题
substr($str,0,13).chr(0);
有个缺点:用chr(0)截取的页面,在ajax文件中调用时会有问题
* Code By 唠叨
*
* 根据 唠叨老大 以前发在CSDN的代码添加了点点东西
* @todo 中文截取,支持gb2312,gbk,utf-8,big5
*
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取长度
* @param string $charset utf-8|gb2312|gbk|big5 编码
* @param $suffix 是否加尾缀
*
*/
function CsubStr($str, $start=0, $length=20, $suffix='', $charset="utf-8")
{ if(@function_exists("mb_substr"))
{
$slice = @mb_substr($str, $start, $length, $charset);
if( mb_strlen($str,$charset) > $start+$length )$slice.=$suffix;
Return $slice;
} $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
//简化后为
//$re['utf-8'] = "/[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; preg_match_all($re[$charset], $str, $match);
$slice = @join("",array_slice($match[0], $start, $length)); if( strlen($str) > $start+$length )$slice.=$suffix; Return $slice;
}//End Function
http://space.xzcn.com/1000006/blog/show/fae0b27c451c728867a567e8c1bb4e53.html