PHP 中英文混合排版中处理字符串常用的函数

2018-09-07 13:35

阅读:239

  #判断某个位置是中文字符的左还是右半部分,或不是中文
#返回值-1左0不是中文字符1右
#用法
/*
$a=thisis中文;
printis_chinese($a,1);//0
printis_chinese($a,8);//-1
printis_chinese($a,9);//1
*/
functionis_chinese(&$str,$location){
$ch=true;
$i=$location;
while(ord($str[$i])>0xa0&&$i>=0){
$ch=!$ch;
$i--;
}

if($i!=$location){
$f_str=$ch?1:-1;
}
else{
$f_str=false;
}

return$f_str;
}


#中文字符串倒置函数
#如果一个将一个有中文的字符串用strrev倒过来,就会产生乱码
/*
printcstrrev(thisis中文);//文中sisiht
*/

functioncstrrev(&$str){
$long=strlen($str);
for($f_str=,$chinese=false,$i=$long-1;$i>=0;$i--){
if(ord($str[$i])>0xa0){
$chinese=!$chinese;
if($chinese==false){
$f_str.=$str[$i].$str[$i+1];
}
}
else{
$f_str.=$str[$i];
}
}
return$f_str;
}
/*中文字符串截取函数
一些中文字符串截取函数经常有一些问题,例如在一些自动换行程序中
$a=“1中2”;
经两次截取后,
csubstr($str,$a,0,2);
csubstr($str,$a,2,2)
由于载取位置指向“中”的右字节,可能会是这样的结果
1,2
用本函数会产生正确的结果
1中,2
*/
#start开始位置,从0开始
#long=0则从start一直取到字符串尾
#ltor=true时从左到右取字符,false时到右到左取字符
#$cn_len中文字符按字节取还是字数取,如果按字数取,则一个中文当一个字节计算

functioncsubstr(&$str,$start=0,$long=0,$ltor=true,$cn_len=2){
if($long==0)$long=strlen($str);
if($ltor==false)$str=cstrrev($str);

if($cn_len==1){

for($i=0,$fs=0;$i<$start;$fs++)
$i+=(ord($str[$fs])<=0xa0)?1:0.5;
for($i=0,$fe=$fs;$i<$long;$fe++)
$i+=(ord($str[$fe])<=0xa0)?1:0.5;
$long=$fe-$fs;

}
else{

$fs=(is_chinese($str,$start)==1)?$start-1:$start;
$fe=$long+$start-1;
$end=(is_chinese($str,$fe)==-1)?$fe-1:$fe;
$long=$end-$fs+1;
}

$f_str=substr($str,$fs,$long);
if($ltor==false)$f_str=cstrrev($f_str);

return$f_str;
}

#取左字符串
#当cn_len==2时$long取左边多少个字,反之则取左边多少个字节
functioncleft(&$str,$long,$cn_len=2){
$f_str=csubstr($str,0,$long,true,$cn_len);
return$f_str;
}

#取右字符串
functioncright(&$str,$long,$cn_len=2){
$f_str=cstrrev($str);
$f_str=csubstr($f_str,0,$long,true,$cn_len);
$f_str=cstrrev($f_str);
return$f_str;
}
#对含有中文字符的文章分行格式化
#再也不会发生因换行问题而产生的种种问题啦!!!
#注:文章的每一行必须用n(chr(13))进行分行
#$width每行多少字符
#$br将每行用什么字符当结束符

functionctext_wrap(&$text,$width=60,$br=<BR>){
$lines=explode(n,$text);
$rows=count($lines);

for($i=0;$i<$rows;$i++){
$len=strlen($lines[$i]);
for($j=0;$j<$len;$j+=$width){
$p=$j+$width-1;
$k=0;
if($p<$len){
while(!is_chinese($lines[$i],$p)&&$lines[$i][$p]!=&&$p>$j){
$k++;
$p--;
}
if($p==$j)$k=0;
}
$f_str.=csubstr($lines[$i],$j,$width-$k).$br;
$j-=$k;
}
}
return$f_str;
}


评论


亲,登录后才可以留言!