Получение отрывка из HTML в PHP

Мне нужно получить краткий отрывок новостей, написанных в формате HTML, чтобы показать их на первой странице. Очевидно, я не могу использовать что-то столь же простое, как substr потому что он может оставить теги незакрытыми или даже оставить половину тега.

Что проще:

  • Преобразование HTML в приличный текстовый вид и взятие части этого
  • Принимая начало из HTML и закрывая любые закрытые теги при обрезании (будет ли это всегда выглядеть нормально?)

И как я могу реализовать выбранное решение?

Solutions Collecting From Web of "Получение отрывка из HTML в PHP"

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; } //