截取字符串长度 不算html代码的长度

来源:互联网 发布:淘宝 宝贝 排名 编辑:程序博客网 时间:2024/05/21 01:27
function blog_summary($body, $size, $format = NULL){

  $_size = mb_strlen($body, 'utf-8');

   

  if($_size <= $size) return $body;

   

  // 输入格式中有 PHP 过滤器

//  if(!isset($format) && filter_is_php($format)){

 //   return $body;

//  }

   

  $strlen_var = strlen($body);

   

  // 不包含 html 标签

  if(strpos($body, '<') === false){

    return mb_substr($body, 0, $size,'utf-8');

  }

   

  // 包含截断标志,优先

  if($e = strpos($body, '<!-- break -->')){

    return mb_substr($body, 0, $e,'utf-8');

  }

   

  // html 代码标记

  $html_tag = 0;

   

  // 摘要字符串

  $summary_string = '';

   



  $html_array = array('left' => array(), 'right' => array());

  for($i = 0; $i < $strlen_var; ++$i) {

    if(!$size){

      break;

    }

     

    $current_var = substr($body, $i, 1);

     

    if($current_var == '<'){

      // html 代码开始

      $html_tag = 1;

      $html_array_str = '';

    }else if($html_tag == 1){

      // 一段 html 代码结束

      if($current_var == '>'){

      

        $html_array_str = trim($html_array_str);

         


        if(substr($html_array_str, -1) != '/'){

           

          // 判断第一个字符是否 /,若是,则放在 right 单元

          $f = substr($html_array_str, 0, 1);

          if($f == '/'){

            // 去掉 /

            $html_array['right'][] = str_replace('/', '', $html_array_str);

          }else if($f != '?'){

            // 判断是否为 ?,若是,则为 PHP 代码,跳过

      

            if(strpos($html_array_str, ' ') !== false){

              // 分割成2个单元,可能有多个空格,如:<h2 class="" id="">

              $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));

            }else{

        
              $html_array['left'][] = strtolower($html_array_str);

            }

          }

        }

         

        // 字符串重置

        $html_array_str = '';

        $html_tag = 0;

      }else{

   

        $html_array_str .= $current_var;

      }

    }else{

      // 非 html 代码才记数

      --$size;

    }

     

    $ord_var_c = ord($body{$i});

     

    switch (true) {

      case (($ord_var_c & 0xE0) == 0xC0):

        // 2 字节

        $summary_string .= substr($body, $i, 2);

        $i += 1;

      break;

      case (($ord_var_c & 0xF0) == 0xE0):

         

        // 3 字节

        $summary_string .= substr($body, $i, 3);

        $i += 2;

      break;

      case (($ord_var_c & 0xF8) == 0xF0):

        // 4 字节

        $summary_string .= substr($body, $i, 4);

        $i += 3;

      break;

      case (($ord_var_c & 0xFC) == 0xF8):

        // 5 字节

        $summary_string .= substr($body, $i, 5);

        $i += 4;

      break;

      case (($ord_var_c & 0xFE) == 0xFC):

        // 6 字节

        $summary_string .= substr($body, $i, 6);

        $i += 5;

      break;

      default:

        // 1 字节

        $summary_string .= $current_var;

    }

  }

 

  if($html_array['left']){



     

   

    $html_array['left'] = array_reverse($html_array['left']);

     

    foreach($html_array['left'] as $index => $tag){

      // 判断该标签是否出现在 right 中

      $key = array_search($tag, $html_array['right']);

      if($key !== false){

        // 出现,从 right 中删除该单元

        unset($html_array['right'][$key]);

      }else{

        // 没有出现,需要补全

        $summary_string .= '</'.$tag.'>';

      }

    }

  }

  return $summary_string;

}

0 0
原创粉丝点击