Как получить часть большого текста без потери HTML-тегов с помощью php?

Я получаю большой контент из API, примерно так:

Lorem <div class = "highlighted">ipsum dolor</div> 
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit 
esse cillum dolore eu fugiat nulla pariatur

Я хочу показать около 10 слов из этого контента. И также я не хочу пропустить часть <div class = "highlighted">ipsum dolor</div>. Я имею в виду, что div и class = "highlighted" не следует удалять.

Я пробовал эту функцию:

 function getPartialContent($content, $words_number)
    {
        $no_tags_content = preg_replace("/\r|\n/", "", html_entity_decode(filter_var($content, FILTER_SANITIZE_STRING)));

        $words = explode(" ", $no_tags_content);
        $result = implode(" ", array_splice($words, 0, $words_number));
        return $result;
    }

Единственная проблема в том, что эта функция сначала удаляет все теги html. Если я не использую preg_replace для удаления тегов html, результат будет примерно таким (div не закрыт):

Lorem sed do eiusmod tempor incididunt is that this <div class = "highlighted">ipsum

чего я не хочу.

Я ожидаю, что результат будет с закрытыми тегами или вообще без тегов. Обычно в div есть одно или два слова. Количество слов в результате не так важно. Я просто хочу, чтобы он был коротким, от 10 до 15 слов.

какой результат вы ожидаете?

lagripe 30.12.2018 17:20

@lagripe см. мой обновленный вопрос. последний абзац

Ahmad Mobaraki 30.12.2018 17:25

Либо вы работаете с DomDocumentили, вы сначала подсчитываете «слова» в элементах html и добавляете это число к $ words_number, чтобы гарантировать, что они никогда не будут усечены.

Jeff 30.12.2018 17:35
или сначала разбивается по тегам html
Jeff 30.12.2018 17:39

см. regex101.com/r/3dEqDC/1

lagripe 30.12.2018 18:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
60
1

Ответы 1

Вы можете попробовать что-то вроде этого:

$rgxp = '/^(\W*(<[^>]+>\W*)?\w+(\W*<[^>]+>)?\W*){10,15}/';
preg_match($rgxp, $text, $mtch);
echo "\n",$mtch[0], "\n";

Расширенный:

$rgxp = '/
^             # start of line
(             # group to quantify
\W*           # ignore space & punctuation
(<[^>]+>\W*)? # optional opening tag group
\w+           # the words to count
(\W*<[^>]+>)? # optional closing tag group
\W*           # ignore space & punctuation
) {10,15}     # quantifier
/x';

Другие вопросы по теме