禁止使用由dedecms的cn_substr()和cn_substr_utf8()截获的字符串ms。通常习惯用cn_substr(),不愿意用哪个cn_substr_utf8()就用哪个。今天,它更准确了。根据一个汉字,可以启用两个字节。
展示方式:
1.寻找\include\helpers\string.helper.php来替换原来的33到102行(即定义cn_substr()函数的代码)。如果怕不行,可以先备份这个文件,亲爱的;
复制代码如下:
/**
*截取中英文字符串,汉字包含2个字节
*
*@accesspublic
*@paramstring$str必须截取的字符串
*@paramint$cutLen的截取长度
*@parambool$cutSlashes,要去掉吗\
*@parambool$addSlashes是它有HTML
*@returnstring
*/[function_exists('cn_substr'){
functioncn_substr($str,$cutLen,$oDot=null,$hasHtml=false,$cutSlashes=false,$addSlashes=false){
global$CFG_soft_lang;
$str=trim($str);
if($cutslashes)$str=stripslashes($str);
if($hashhtml){
$str=preg_replace("/(\<;【^\<;]*\>;|\r|\n|\s|\[。?\])/是“,'',$str);
$str=htmlspecialchars($str);
}else{
$str=htmlspecialchars($str);
}
if($cutLen&;&strlen($str)>$cutLen){
$nStr=";
if($CFG_soft_lang=='utf-8'){
$n=0;
$TN=0;
$NOC=0;
while($n<;strlen($str)){
$t=ord($str[$n]);
if($t==9||$t==10||(32<;=$t&&$t<=126)){
$TN=1;
$n;
$NOC;
}elseif(194<;=$t&&$t<=223){
$TN=2;
$n=2;
$NOC=2;
}elseif(224<;=$t&&$t<239){
$TN=3;
$n=3;
$NOC=2;
}elseif(240<;=$t&&$t<=247){
$TN=4;
$n=4;
$NOC=2;
}elseif(248<;=$t&&$t<=251){
$TN=5;
$n=5;
$NOC=2;
}elseif($t==252||$t==253){
$TN=6;
$n=6;
$NOC=2;
}else{
$n;
}
if($NOC>;=$cutLen)break;
}
if($NOC>;$cutLen)$n-=$TN;
$nStr=substr($str,0,$n);
}else{
for($I=0;$i<$cutLen–1;$I){
if(ord($str[$I])>;127){
$nStr。=$str[$i]。$str[$I1];
$I;
}else{
$nStr。=$str[$I];
}
}
}
$str=$nStr。$oDot
}
if($addSlashes)$str=addSlashes($str);
$str=htmlspecialchars_decode($str);
returntrim($str);
}
}
第二,全站应用cn_substr()函数,不管你的程序流是gbk还是utf8;
比如你需要启用10个字符(混拼音汉字):[field:titlefunction='cn_substr(@me,20)']。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)