判断某个位置是中文字符的左还是右半部分,或不是中文 #返回值-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,2); csubstr($str,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,true,$cn_len); return$f_str; } #取右字符串 functioncright(&$str,$cn_len=2){ $f_str=cstrrev($str); $f_str=csubstr($f_str,$cn_len); $f_str=cstrrev($f_str); return$f_str; } #对含有中文字符的文章分行格式化 #再也不会发生因换行问题而产生的种种问题啦!!! #注:文章的每一行必须用n(chr(13))进行分行 #$width每行多少字符 #$br将每行用什么字符当结束符 functionctext_wrap(&$text,$width=60,$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; }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|