dedecms 的cn_substr_utf8字符串截取函数商榷

dedecms 的cn_substr_utf8字符串截取函数商榷,第1张

dedecms的cn_substr_utf8字符串截取函数商榷

phpsir看到的文章主要是关于DEDEECMS的cn_substr_utf8函数,好像是一些比较难的问题,科学研究DEDEECMS的盆友可以看看。

在dedecms中,cn_substr_utf8函数是这样的


复制代码编码如下:
/**
*utf-8中文拦截,单字节拦截方法
*
*@accesspublic
*@必须拦截的paramstring$str数组
*@paramint$slenlengthintercepted
*@paramint$startdd刚开始识别
*@returnfunction_exists('cn_substr_utf8'))
$start1)
{
return“”;
}
preg_match_all("/。/su",$str,$ar);
$str='';
$tstr='';</p>; <;p>//为了更好地兼容mysql4.1的以下版本号,并与数据库查询varchar保持一致,这里,我们要按字节数截取
for($I=0;isset($ar[0][$I]);$I)
{
if(strlen($tstr)<;$start)
{
$tstr。=$ar[0][$I];
}
else
{
if(strlen($str)<;$lengthstrlen($ar[0][$I])
{
$str。=$ar[0][$I];
}
else
{
break;
}
}
}
return$str;
}
}

在那里


复制代码如下:
if(strlen($str)<$lengthstrlen($ar[0][$I])

一行可能会在截取后导致一个额外的字符,可以将其更改为


复制代码如下:
if(strlen($str)<$lengthstrlen($ar[0][$I])-1)

测试程序如下


复制代码如下:
$f="Hellofasdfa,fasdf#e#";
$pos=strpos($f,'#e#');
var_dump($pos);
var_dump(cn_substr_utf8($f,$pos));
var_dump(cn_substr_utf82($f,$pos));</p>; <;p>functioncn_substr($str,$slen,$startdd=0)
{
global$CFG_soft_lang;
if($CFG_soft_lang=='utf-8')
{
returncn_substr_utf8($str,$slen,$startdd);
}
$restr='';
$c=“”;
$str_len=strlen($str);
if($str_len<;$startdd1)
{
return“”;
}
if($str_len<;$startdd$slen||$slen==0)
{
$slen=$str_len-$startdd;
}
$enddd=$startdd$slen-1;
for($I=0;$i<$str_len$i){if($startdd==0){$restr。=$c;}elseif($I>;$startdd)
{
$restr。=$c;
}<;/p>; <;p>if(ord($str[$I])>;0x80)
{
if($str_len>;$i1)
{
$c=$str[$i]。$str[$I1];
}
$I;
}
else
{
$c=$str[$I];
}<;/p>; <;p>if($I>;=$enddd)
{
if(strlen($restr)strlen($c)>;$slen)
{
break;
}
else
{
$restr。=$c;
break;
}
}
}
return$restr;
}<;/p>; <;p>functioncn_substr_utf8($str,$length,$start=0)
{
if(strlen($str)<;$start1)
{
return“”;
}
preg_match_all("/。/su",$str,$ar);</p>; <;p>$str=“”;
$tstr='';</p>; <;p>//为了更好地兼容mysql4.1的以下版本号,并与数据库查询varchar保持一致,这里,我们要按字节数截取
for($I=0;isset($ar[0][$I]);$I)
{
if(strlen($tstr)<;$start)
{<;/p>; <;p>$tstr。=$ar[0][$I];
}
else
{<;/p>; <;p>if(strlen($str)<;$lengthstrlen($ar[0][$I])
{<;/p>; <;p>$str。=$ar[0][$I];
}
else
{<;/p>; <;p>打破;
}
}
}
return$str;
}<;/p>; <;p>函数cn_substr_utf82($str,$length,$start=0)
{
if(strlen($str)<;$start1)
{
return“”;
}
preg_match_all("/。/su",$str,$ar);</p>; <;p>$str=“”;
$tstr='';</p>; <;p>//为了更好地兼容mysql4.1的以下版本号,并与数据库查询varchar保持一致,这里,我们要按字节数截取
for($I=0;isset($ar[0][$I]);$I)
{
if(strlen($tstr)<;$start)
{<;/p>; <;p>$tstr。=$ar[0][$I];
}
else
{<;/p>; <;p>if(strlen($str)<;$lengthstrlen($ar[0][$I])-1)//PHPsiradded-1
{}
else
{<;/p>; <;p>打破;
}
}
}
return$str;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/773382.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-03
下一篇2022-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存