_RVK_
Новичок
Закрытие HTML тегов при обрезании строки.
Иногда на форуме появляется вопрос на тему "Как закрыть 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;
}