PHP的substr截取中文字符的解决方法

网上找了找,有很多种解决函数,但要么有问题,要么就太长。
在php手册中看到了一个函数,可以正常截取长度,如下:

<?php
function utf8_substr($str,$from,$len){
	return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1',$str);
}
?>

但这个函数有一个问题,就是把中文当作一个字符来处理,并不是我需要的。通过对这个正则的分析,写了一个可以把中文字符当作两个字符来处理的函数,如下:

<?php
function kc_substr($str,$from,$len){
	preg_match_all('#(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+)#s',$str,$array, PREG_PATTERN_ORDER);
	$from1=0;
	$len1=0;
	foreach($array[0] as $key =--> $val){
		$n=ord($val)>=128 ? 2:1;
		$from1+=$n;
		if($from1>$from){
			$len1+=$n;
			if($len1<=$len){
				$s.=$val;
			}else{
				return $s.'..';
			}
		}
	}
	return $s;
}
$s='中华人民共和国'; 
echo $s.'';
echo kc_substr($s,3,8).'';
?>

函数是在UTF-8编码下测试的,ANSI下不能正常执行。

发表评论