php字符串截取,检测字符串编码方法

<?php
/**
 * 中文字符串截取
 */
function subString($str, $start, $length) {
    $i = 0;
    //完整排除之前的UTF8字符
    while($i < $start) {
        $ord = ord($str{$i});
        if($ord < 192) {
            $i++;
        } elseif($ord < 224) {
            $i += 2;
        } else {
            $i += 3;
        }
    }
    //开始截取
    $result = '';
    while($i < $start + $length && $i < strlen($str)) {
        $ord = ord($str{$i});
        if($ord < 192) {
            $result .= $str{$i};
            $i++;
        } elseif($ord <224) {
            $result .= $str{$i}.$str{$i+1};
            $i += 2;
        } else {
            $result .= $str{$i}.$str{$i+1}.$str{$i+2};
            $i += 3;
        }
    }
    if($i < strlen($str)) {
        $result .= '...';
    }
    return $result;
}

/**
 * 检测编码
 */

function safeEncoding($string,$outEncoding = 'UTF-8') {
	$encoding = "UTF-8";
	for($i = 0; $i<strlen($string); $i++) {
		if(ord($string{$i}) < 128) {
			continue;
		}

		if((ord($string{$i}) & 224) == 224) {
			//第一个字节判断通过
			$char = $string{++$i};
			if((ord($char) & 128) == 128) {
				//第二个字节判断通过
				$char = $string{++$i};
				if((ord($char) & 128) == 128) {
					$encoding = "UTF-8";
					break;
				}
			}
		}
		if((ord($string{$i}) & 192) == 192) {
			//第一个字节判断通过
			$char = $string{++$i};
			if((ord($char) & 128) == 128) {
				//第二个字节判断通过
				$encoding = "GB2312";
				break;
			}
		}
	}

	if(strtoupper($encoding) == strtoupper($outEncoding)) {
		return $string;
	} else {
		return iconv($encoding,$outEncoding,$string);
	}
}


class splite_utf8
{
    private  function splite_single_utf8_left_word ($str )
    {
         $aciss = ord( $str);
         $out_str = '';

         if ($aciss >= 240 )
         {
              $out_str.=substr ( $str, 0, 4 );
         }
         elseif ($aciss >= 224 )
         {
              $out_str.=substr ( $str, 0, 3 );
         }
         elseif ($aciss >= 192 )
         {
              $out_str.=substr ( $str, 0, 2 );
         }
         else
         {
              $out_str.=substr ($str, 0, 1 );
         }
         return $out_str;
    }

    private  function splite_single_utf8_right_word ($str )
    {
         $aciss = ord( $str);
         $out_str = '';

         if ($aciss >= 240 )
         {
              $out_str.=substr ( $str, 4 );
         }
         elseif ($aciss >= 224 )
         {
              $out_str.= substr ( $str, 3 );
         }
         elseif ($aciss >= 192 )
         {
              $out_str.= substr ( $str, 2 );
         }
         else
         {
              $out_str.= substr ($str, 1 );
         }

         return $out_str;
    }

    public function count_word($str, $length=0 )
    {
         $aciss = ord( $str);

         if ($aciss >= 240 )
         {
              $length+= 1;
              $str=substr($str,4);
         }
         elseif ($aciss >= 224 )
         {
              $length+= 1;
              $str=substr($str,3);
         }
         elseif ($aciss >= 192 )
         {
              $length+= 1;
              $str=substr($str,2);
         }
         else
         {
              $length+= 1;
              $str=substr($str,1);
         }

         if($str=='')
         {
              return $length;
         }
         else
         {
              return $this->count_word($str,$length);
         }
    }
    
    public function splite_mulit_utf8_word ($str, $start = 0, $length = -1 )
    {
         $temp = '';
         
         if($start < 0 )
         {
              $start = $this->count_word($str) + $start;     
         }
         
         for ($i = 0; $i < $start; $i++ )
         {
              $str=$this->splite_single_utf8_right_word ($str );
         }

         for ($i = 0; $i < $length; $i++ )
         {
              $temp.= $this->splite_single_utf8_left_word ($str );
              $str = $this->splite_single_utf8_right_word ($str );
         }

         if( $length == -1 )
         {
              return $str;
         }
         else
         {
              return $temp;
         }
    }
}

$utf=new splite_utf8();
$text='的萨芬dfdf!@#$%^&*I()';
$length=$utf->count_word($text);
echo $length."/n";
$word=$utf->splite_mulit_utf8_word ($text, 3, 2);
var_dump($word);
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值