php中几个截取字符串函数

2009-06-27 15:03:59 作者:allniu 来源:www.allniu.com 浏览次数:0 网友评论 0

php中几个截取字符串函数

/*****************************(一)**********************/
/**
 * 截取字符串函数.
 * @author allniu
 * @param string $str 要截取的字符串
 * @param int $len 截取字符串的长度
 * @param int $padstr 代替字符串
 * @return string
 */
function subcnstr($str, $len, $padstr="…")
{
 $ret="";
 if ( strlen($str)<=$len )
 { return $str;
 }

 $len=$len-strlen($padstr);
 for($i=0; $i<$len; $i++)
 { $ret.=$str[$i];
  if (ord($str[$i])>128)
  { $i++;
   $ret.=$str[$i];
  }
 }
 $ret.=$padstr;

 return $ret;
}

/********************************(二)****************************/
 /**
 * @Description :cutSubstr 截取字符串
 * @param $string (字符串 字符串类型)
 * @param $start (开始截取位置 整型)
 * @param $length (截取长度 整型)
 * @return String (返回字符串)
 */
 static function cutSubstr($string,$start=0,$length=0,$tail='')
 {
  $l = $length;
  if($l == 0)$l = strlen($string);
  if($start< 0 || $l < 0)
  {
   return $string;
  }
  if(($start+$l) >= strlen($string))
  {
   return substr($string,$start,$l);
  }
  else
  {
   $j=0;
   $num=$l;
   for($i=$start; $i< $num-1;$i++)
   {
    if(ord(substr($string,$i,1))>0xa0) $j++;
   }
   if($j%2!=0)
   {
    $num=$num+1;
   }else
   {
    $num=$num;
   }
   return substr($string,$start,$num-1).$tail;
  }
 }

/*************************(三)****************/
 /***
  * 中英文字符截取
  * $string 要处理的字符串
  * $strlen 截取后字符串长度
  * $encoding  截取字符的编码格式
  * $title  是否在title中显示完整的字符串
  * $etc  截取后显示的字符
  */
 public function cn_substr($string,$strlen=10,$encoding="UTF-8",$title=false,$etc='...',$mode=0,$utf8LenFlag="no")
 {
  if ($encoding == "UTF-8"){
   mb_internal_encoding($encoding);
  }
  $rstr = $string;
  $retval = "";
  $nod = "";
  //匹配不含有中文字符
  if(preg_match_all("/^[^".chr(0xa1)."-".chr(0xff)."]+$/",$rstr,$match)){
   //判断纯非中文字符是否乘以2的长度
   $utf8Len = mb_strlen($match[0][0],$encoding);
      if ($mode === 0){
    if($utf8LenFlag != "no"){
     $utf8Len = mb_strwidth($match[0][0],$encoding); 
    }
       $strlen = ($strlen-1)*2;
      }
      else{
       if($utf8LenFlag == "yes"){
        $strlen = $strlen*2;
       }
      }
   if($utf8Len == $strlen){
       $rstr;
   }
      elseif($utf8Len > $strlen){
       $rstr = mb_substr($rstr,0,$strlen).$etc.$nod.$retval;
    if ($title){
     $rstr = '<font title="'.$string.'">'.$rstr.'</font>';
    } 
      }
   else{
    $rstr = $string;
   }
  }
  else{   
   if ($mode === 1){ //一个汉字算一个字符、一个字母也算一个字符的情况
    if(mb_strlen($rstr,$encoding) > $strlen){
     $rstr = mb_substr($rstr,0,$strlen-1,$encoding).$etc.$nod.$retval;
     if ($title){
      $rstr = '<font title="'.$string.'">'.$rstr.'</font>';
     } 
    } 
    else {
     $rstr = $string;
    }
   }
   
   if ($mode === 0){ //一个汉字算两个字符、一个字母算一个字符的情况
    if($utf8LenFlag == "no"){
     $utf8Len = mb_strlen($rstr,$encoding);
    }
    else{
     $utf8Len = mb_strwidth($rstr,$encoding); 
    }
    if($utf8Len > $strlen){
     $rstr = $this->cn_substring($string,$strlen,0,$encoding,$title,$etc).$etc;
     if ($title){
      $rstr = '<font title="'.$string.'">'.$rstr.'</font>';
     } 
    } 
    else {
     $rstr = $string;
    }   
   }
  }
   return $rstr;
  
 }
 /***********************(四)*****************/
 //中文截取2,单字节截取模式
 public function cn_substring($str,$slen,$startdd=0,$cfg_soft_lang='UTF-8',$title=false,$etc='...')
 {
  if($cfg_soft_lang=='UTF-8')
  {
   return $this->cn_substr_utf8($str,$slen,$startdd,$title,$etc);
  }
  $restr = '';
  $c = '';
  $str_len = strlen($str);
  if($str_len < $startdd+1)
  {
   return '';
  }
  if($str_len < $startdd + $slen || $slen==0)
  {
   $slen = $str_len - $startdd;
  }
  $enddd = $startdd + $slen - 1;
  for($i=0;$i<$str_len;$i++)
  {
   if($startdd==0)
   {
    $restr .= $c;
   }
   else if($i > $startdd)
   {
    $restr .= $c;
   }
 
   if(ord($str[$i])>0x80)
   {
    if($str_len>$i+1)
    {
     $c = $str[$i].$str[$i+1];
    }
    $i++;
   }
   else
   {
    $c = $str[$i];
   }
 
   if($i >= $enddd)
   {
    if(strlen($restr)+strlen($c)>$slen)
    {
     break;
    }
    else
    {
     $restr .= $c;
     break;
    }
   }
  }
  return $restr;
 }
 
 //utf-8中文截取,单字节截取模式
 public function cn_substr_utf8($str, $length, $start=0, $title=false, $etc='...')
 {
  if(strlen($str) < $start+1)
  {
   return '';
  }
  preg_match_all("/./su", $str, $ar);
  $str = '';
  $tstr = '';
 
  //为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
  for($i=0; isset($ar[0][$i]); $i++)
  {
   if(strlen($tstr) < $start)
   {
    $tstr .= $ar[0][$i];
   }
   else
   {
    if(strlen($str) < $length + strlen($ar[0][$i]) )
    {
     $str .= $ar[0][$i];
    }
    else
    {
     break;
    }
   }
  }
  return $str;
 }


以上为截取字符串的总结。代码均已经过测试

相关文章

[错误报告] [收藏] [打印] [关闭] [返回顶部]

最新图片文章

最新文章