• 截取指定长度的字符串


    /*
     * 函数说明:截取指定长度的字符串
     *         utf-8专用 汉字和大写字母长度算1,其它字符长度算0.5
     *
     * @param  string  $str  原字符串
     * @param  int     $len  截取长度
     * @param  string  $etc  省略字符...
     * @return string        截取后的字符串
     */
    if(!function_exists('ReStrLen'))
    {
    	function ReStrLen($str, $len=10, $etc='...')
    	{
    		$restr = '';
    		$i = 0;
    		$n = 0.0;
    	
    		//字符串的字节数
    		$strlen = strlen($str);
    		while(($n < $len) and ($i < $strlen))
    		{
    		   $temp_str = substr($str, $i, 1);
    	
    		   //得到字符串中第$i位字符的ASCII码
    		   $ascnum = ord($temp_str);
    	
    		   //如果ASCII位高与252
    		   if($ascnum >= 252) 
    		   {
    				//根据UTF-8编码规范,将6个连续的字符计为单个字符
    				$restr = $restr.substr($str, $i, 6); 
    				//实际Byte计为6
    				$i = $i + 6; 
    				//字串长度计1
    				$n++; 
    		   }
    		   elseif($ascnum >= 248)
    		   {
    				$restr = $restr.substr($str, $i, 5);
    				$i = $i + 5;
    				$n++;
    		   }
    		   elseif($ascnum >= 240)
    		   {
    				$restr = $restr.substr($str, $i, 4);
    				$i = $i + 4;
    				$n++;
    		   }
    		   elseif($ascnum >= 224)
    		   {
    				$restr = $restr.substr($str, $i, 3);
    				$i = $i + 3 ;
    				$n++;
    		   }
    		   elseif ($ascnum >= 192)
    		   {
    				$restr = $restr.substr($str, $i, 2);
    				$i = $i + 2;
    				$n++;
    		   }
    	
    		   //如果是大写字母 I除外
    		   elseif($ascnum>=65 and $ascnum<=90 and $ascnum!=73)
    		   {
    				$restr = $restr.substr($str, $i, 1);
    				//实际的Byte数仍计1个
    				$i = $i + 1; 
    				//但考虑整体美观,大写字母计成一个高位字符
    				$n++; 
    		   }
    	
    		   //%,&,@,m,w 字符按1个字符宽
    		   elseif(!(array_search($ascnum, array(37, 38, 64, 109 ,119)) === FALSE))
    		   {
    				$restr = $restr.substr($str, $i, 1);
    				//实际的Byte数仍计1个
    				$i = $i + 1;
    				//但考虑整体美观,这些字条计成一个高位字符
    				$n++; 
    		   }
    	
    		   //其他情况下,包括小写字母和半角标点符号
    		   else
    		   {
    				$restr = $restr.substr($str, $i, 1);
    				//实际的Byte数计1个
    				$i = $i + 1; 
    				//其余的小写字母和半角标点等与半个高位字符宽
    				$n = $n + 0.5; 
    		   }
    		}
    	
    		//超过长度时在尾处加上省略号
    		if($i < $strlen)
    		{
    		   $restr = $restr.$etc;
    		}
    	
    		return $restr;
    	}
    }
    

      

  • 相关阅读:
    systemmap 使用记录
    reading code record
    吞吐问题
    debug cps 原因
    fopen的a+和rewind
    debug cps && perf debug
    tfo以及quic的阅读笔记
    ss 和netstat
    debug open files
    多核编程 local global
  • 原文地址:https://www.cnblogs.com/xy404/p/3983481.html
Copyright © 2020-2023  润新知