自己写了个:
function csubstr($string,$start,$length) {
if(ord($string[$start])>0xa0 && ord($string[$start+1])<=0xa0) $str=$string[$start-1];
for($i=$start;$i<$length;$i++){
if(ord($string[$i])>0xa0){
$str.=$string[$i].$string[$i + 1];
$i++;
}else $str.=$string[$i];
}
return $str;
}
function csubstr($string,$start,$length) {
if(ord($string[$start])>0xa0 && ord($string[$start+1])<=0xa0) $str=$string[$start-1];
for($i=$start;$i<$length;$i++){
if(ord($string[$i])>0xa0){
$str.=$string[$i].$string[$i + 1];
$i++;
}else $str.=$string[$i];
}
return $str;
}
$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);
}$t = "我那个csubstr只能从0截取到某个字符";
echo c_substr($t,2);
echo c_substr($t,2,5);
echo c_substr($t,2,-4);
echo c_substr($t,-5);
{
if(strlen($txt)>$num)
{
$txt = substr($txt, 0, $num-4) ;
$txt .= chr(0) . "..." ;
}
return $txt ;
}这么简单的没人用 请问它存在什么避端吗?
{
if(strlen($string)>$len) {
for $i=0; $i<$len; $i++){
$strcut.= ord($string[$i]>127) ? $string[$i].$string[++$i] : $string[$i];}
return $strcut.".....";
}else{
return $strcut;}
}$str='这个是discuz用的.中英文均可.但中文占两个字符.';
cutstr($str,6)='这个是.....';
其实并不需要知道一个汉字是否被截断了,所以cutstr的效率就不如mysubstr了c_substr函数适用于需要精确的截取的场合,不要看他的代码较多但是效率一点都不低。
经测试,他的运行时间是mb_substr的三倍,属于同一数量级。而且原串的长度不影响运行时间。
而与cutstr函数一样采用逐字判断算法的函数都有运行时间随原串增长而增长的毛病