Но бывает так, что надо вывести цитату определенной длины, не потеряв при этом форматирование.
Но при попытке сохранить форматирование, обрезав контент, мы также обрезаем теги и получаем в итоге "кашу" на странице.
Для решения проблемы нам надо закрыть все теги для обрезанного контента.
К счастью php, начиная с версии 5,4 поддерживает Tidy HTML - утилиту для очистки и восстановления HTML.
$tidy_config = array( 'char-encoding' => 'utf8', 'clean' => true, 'output-html' => true, 'input-html' => true, 'wrap-attributes' => true, 'wrap-php' => false, 'wrap' => 0); // закрываем открытые html tags $tidy = tidy_parse_string($out, $tidy_config, 'UTF8'); $tidy->cleanRepair(); $out = $tidy;
Вот окончательная функция для получения корректной цитаты с сохранением форматирования.
За основу я взял скрипт с сайта wp-kama.ru
function kama_excerpt($args=''){ global $post; parse_str($args, $i); $maxchar = isset($i['maxchar']) ? (int)trim($i['maxchar']) : 350; $text = isset($i['text']) ? trim($i['text']) : ''; $save_format = isset($i['save_format']) ? trim($i['save_format']) : false; $echo = isset($i['echo']) ? false : true; if($save_format == false) $save_format='<strong><p><ul><ol><li><br>'; if (!$text){ $out = $post->post_excerpt ? $post->post_excerpt : $post->post_content; $out = preg_replace ("!\[/?.*\]!U", '', $out ); //убираем шоткоды, например:[singlepic id=3] // для тега <!--more--> if( !$post->post_excerpt && strpos($post->post_content, '<!--more-->') ){ preg_match ('/(.*)<!--more-->/s', $out, $match); $out = str_replace("\r", '', trim($match[1], "\n")); $out = preg_replace( "!\n\n+!s", "</p><p>", $out ); $out = "<p>". str_replace( "\n", "<br />", $out ) ."</p>"; if ($echo) return print $out; return $out; } } $out = $text.$out; $out = strip_tags($out, $save_format); if ( iconv_strlen($out, 'utf-8') > $maxchar ){ $out = iconv_substr( $out, 0, $maxchar, 'utf-8' ); $out = rtrim($out); $out = preg_replace('@(.*)\s[^\s]*$@s', '\\1 ...', $out); //убираем последнее слово, ибо оно в 99% случаев неполное $tidy_config = array( 'char-encoding' => 'utf8', 'clean' => true, 'output-html' => true, 'input-html' => true, 'wrap-attributes' => true, 'wrap-php' => false, 'wrap' => 0); // закрываем открытые html tags $tidy = tidy_parse_string($out, $tidy_config, 'UTF8'); $tidy->cleanRepair(); $out = $tidy; } if($echo) return print $out; return $out; } ?>
Комментариев нет:
Отправить комментарий