Я получаю большой контент из 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 см. мой обновленный вопрос. последний абзац
Либо вы работаете с DomDocumentили, вы сначала подсчитываете «слова» в элементах html и добавляете это число к $ words_number, чтобы гарантировать, что они никогда не будут усечены.






Вы можете попробовать что-то вроде этого:
$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';
какой результат вы ожидаете?