Мне нужно получить краткий отрывок новостей, написанных в формате HTML, чтобы показать их на первой странице. Очевидно, я не могу использовать что-то столь же простое, как substr
потому что он может оставить теги незакрытыми или даже оставить половину тега.
Что проще:
И как я могу реализовать выбранное решение?
strip_tags()
способ – удалить все HTML из текста элемента с помощью strip_tags()
прежде чем обрезать его.
Я бы взял второй вариант, если важно сохранить структуру HTML исходного элемента новостей.
Простым способом реализации этого было бы запустить фрагмент через Tidy, чтобы закрыть любые закрытые теги. В частности, см. Метод tidy :: cleanRepair .
Привет, я думаю, что то, что вы ищете, называется очисткой веб-сайта. Вот как вы можете очистить сайт; Использование библиотеки PHP Простой HTML DOM Parser скачать здесь PHP Простой HTML DOM Parser
И, наконец, вот код, который вы можете очистить Slashdot
// Create DOM from URL $html = file_get_html('http://slashdot.org/'); // Find all article blocks foreach($html->find('div.article') as $article) { $item['title'] = $article->find('div.title', 0)->plaintext; $item['intro'] = $article->find('div.intro', 0)->plaintext; $item['details'] = $article->find('div.details', 0)->plaintext; $articles[] = $item; } print_r($articles);
Вы можете попытаться разобрать свои данные в XML и затем обрезать только «чистые» текстовые узлы.
Примечание. Это решение заставляет вход быть действительным XML и всегда находиться в одной структуре.
Это отрывается до первого абзаца без резки слов и добавляет дополнительный след.
$ excerpt = self :: excerpt_paragraph ($ html, 180)
/** * excerpt first paragraph from html content * **/ public static function excerpt_paragraph($html, $max_char = 100, $trail='...' ) { // temp var to capture the p tag(s) $matches= array(); if ( preg_match( '/<p>[^>]+<\/p>/', $html, $matches) ) { // found <p></p> $p = strip_tags($matches[0]); } else { $p = strip_tags($html); } //shorten without cutting words $p = self::short_str($p, $max_char ); // remove trailing comma, full stop, colon, semicolon, 'a', 'A', space $p = rtrim($p, ',.;: aA' ); // return nothing if just spaces or too short if (ctype_space($p) || $p=='' || strlen($p)<10) { return ''; } return '<p>'.$p.$trail.'</p>'; } // /** * shorten string but not cut words * **/ public static function short_str( $str, $len, $cut = false ) { if ( strlen( $str ) <= $len ) { return $str; } $string = ( $cut ? substr( $str, 0, $len ) : substr( $str, 0, strrpos( substr( $str, 0, $len ), ' ' ) ) ); return $string; } //