一个比较完善支持gb2312的substr函数
时间:2006-07-25 来源:bufferfly
这段代码不像网络上流传的其它版本,并不依靠逐字节遍历. 基本原理是通过定义 gb2312 编码下一个完整汉字的特征
/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/" 和一个英文字母的特征 "/[\x01-\x77]/" 进行匹配,从而判断需要截取的开始部分和结束部分是否为半个汉字。如果不是,把它之前的所有完整汉字和完整英文字母用preg_replace()去掉,最后跳过余下不完整的部分(加上它们的长度)。
而且,此代码可以支持substr原有的各种参数,包括负数和不完全参数;
不过,当文本中包含扩展字符集GBK中的汉字时,头尾会出现乱码。
function mysubstr($str, $start=0)
{
$ch = chr(127);
$p = array( "/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/" , "/[\x01-\x77]/" );
$r = array( "" , "" );
if(func_num_args() > 2)
{
$len = func_get_arg(2);
}
else
{
$len = strlen($str);
}
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,$len);
$len = strlen($s);
if($s[$len-1] > $ch)
{
$s = preg_replace($p,$r,$s);
$len += strlen($s);
}
return substr($str,$start,$len);
}
相关阅读 更多 +