- $tmp = preg_replace('/[一-龥]/u','<@>','你好我是誰?123abc');
- /u是UTF-8
複製代碼代碼1,PHP截取UTF-8字串,解決半字元問題
/***
- * PHP截取UTF-8字串,解決半字元問題。utf_substr
- * 英文、數字(半形)為1位元組(8位),中文(全形)為3位元組
- * @return 取出的字串, 當$len小於等於0時, 會返回整個字串
- * @param $str 源字串
- * $len 左邊的子串的長度
- * @edit bbs.it-home.org
- function utf_substr($str,$len){
- for($i=0;$i<$len;$i++){
- $temp_str=substr($str,0,1);
- if(ord($temp_str) > 127){
- $i++;
- if($i<$len){
- $new_str[]=substr($str,0,3);
- $str=substr($str,3);
- }
- }else{
- $new_str[]=substr($str,0,1);
- $str=substr($str,1);
- }
- }
- return join($new_str);
- }
//調用樣本
- $str = utf_substr('你好',4);
- echo $str;
- ?>
複製代碼代碼2,截取utf-8字串函數
/**
- * 截取utf-8字串
- * edit bbs.it-home.org
- */
- function cut_str($sourcestr,$cutlength){
- $returnstr='';
- $i=0;
- $n=0;
- $str_length=strlen($sourcestr);//字串的位元組數
- while (($n<$cutlength) and ($i<=$str_length)){
- $temp_str=substr($sourcestr,$i,1);
- $ascnum=Ord($temp_str);//得到字串中第$i位字元的ascii碼
- if ($ascnum>=224){ //如果ASCII位高與224,
- $returnstr=$returnstr.substr($sourcestr,$i,3); //根據UTF-8編碼規範,將3個連續的字元計為單個字元
- $i=$i+3; //實際Byte計為3
- $n++; //字串長度計1
- }elseif ($ascnum>=192){ //如果ASCII位高與192,
- $returnstr=$returnstr.substr($sourcestr,$i,2); //根據UTF-8編碼規範,將2個連續的字元計為單個字元
- $i=$i+2; //實際Byte計為2
- $n++; //字串長度計1
- }elseif ($ascnum>=65 && $ascnum<=90){ //如果是大寫字母,
- $returnstr=$returnstr.substr($sourcestr,$i,1);
- $i=$i+1; //實際的Byte數仍計1個
- $n++; //但考慮整體美觀,大寫字母計成一個高位字元
- }else{ //其他情況下,包括小寫字母和半形標點符號,
- $returnstr=$returnstr.substr($sourcestr,$i,1);
- $i=$i+1; //實際的Byte數計1個
- $n=$n+0.5; //小寫字母和半形標點等與半個高位字元寬...
- }
- }
- if ($str_length>$cutlength){
- $returnstr = $returnstr . "...";//超過長度時在尾處加上省略符號
- }
- return $returnstr;
- }
//調用樣本
- $str = '你好!我好';
- $str = cut_str($str,3);
- echo $str;
- ?>
複製代碼 |