Закрытие HTML тегов при обрезании строки.

_RVK_

Новичок
Закрытие HTML тегов при обрезании строки.

Иногда на форуме появляется вопрос на тему "Как закрыть HTML теги при обрезании строки до заданной длинны". Недавно столкнулся с такой проблемой сам. Посидел подумал и написал функцию.
Смысл в том, что перед "обрезанием" запоминаются позиции тегов в тексте, а после "обрезания" расставляет их по местам. Такой прием работает даже с таблицами, вырезая только текст из ячеек.
Привожу код, для тех кому надо. Критика приветствуется.
PHP:
  //Если параметр $cut_empty_tags истина, то функция так же будет пытаться вырезать пустые парные теги.
  //Обратите внимание, что это не всегда хорошо. Так, например, в этом случае функция удалит все пустые ячейки таблицы,
  //потому с таблицами лучше что бы этот параметр был false.
  function html_str_cut($str,$max_len=50,$percent=50,$substitute='...',$cut_empty_tags=false)
  {
      $html_str = $str;
      $str=strip_tags($str);
      if ($max_len>=strlen($str)) return $html_str;
      if (!$max_len) return '';
      //Ищем все теги в тексте и их позиции
      preg_match_all('/<.*?>/si',$html_str,$tags,PREG_OFFSET_CAPTURE);
      //Обрезаем строку, меняя все вырезанные символы на заменители #0
      $str_len=strlen(strip_tags($str));
      $max_len++;
      $lstr = substr($str,0,$max_len*$percent/100);
      $rstr = substr($str,$str_len-($max_len-strlen($lstr)),$str_len);
      //Сколько символов вырезали?
      $cut_count = $str_len - $max_len;
      $tmp_substitute = str_repeat(chr(0),$cut_count);
      $cuted_str = $lstr.$tmp_substitute.$rstr;
      //Расставляем теги по местам
      foreach($tags[0] as $tag) {
          $cuted_str = str_ins($tag[1],$tag[0],$cuted_str);
      }
      //Вставляем разделитель
      $substitute_pos = strrpos($cuted_str,chr(0));
      $cuted_str = str_ins($substitute_pos,$substitute,$cuted_str);
      //Удаляем заменители
      $cuted_str = str_replace(chr(0),'',$cuted_str);
      //Удаляем "пустые" теги, если задано
      if ($cut_empty_tags) {
          $cuted_str = preg_replace('!<[^>/]+>\s*(<[^>]+>)*\s*(<[^/>]+>)*\s*</[^>]+>!si','',$cuted_str);
      }
      return $cuted_str;
  }

  function str_ins($pos,$subject,$str) {
      $lstr = substr($str,0,$pos);
      $rstr = substr($str,$pos,strlen($str));
      return $lstr.$subject.$rstr;
  }
 
Сверху