Как вырезать HTML-текст в PHP, не нарушая иерархию тегов

Я пытаюсь обрезать текст HTML и нашел тему, но пока не могу комментировать, потому что я новичок (Использование PHP substr () и strip_tags () с сохранением форматирования и без нарушения HTML)

Сначала я создаю функцию предварительный просмотр (ввод: html текст или обычный текст, номер символа, логическое значение, если вы хотите выводить простой текст), но когда я попытался расширить функциональность для работы с тегами HTML, проблема началась

Я использовал функцию html_cut() из другого поста, чтобы закрыть теги, но мне нужно несколько вложенных тегов, и я думаю, что функция закрыла каждый найденный тег, чтобы нарушить иерархию. (Это на самом деле проблема или я ошибаюсь?)

function preview($text, $char, $sinhtml){
if(strlen($text) > $char){
$post = substr($text, $char, 1);
if ($post != " "){
$i = true;
while($post != " "){
if($char > 0 && $i){
$char--;
$post = substr($text, $char, 1);
}elseif($char == 0){
$i = false;
$char++;
}else{
$char++;
$post = substr($text, $char, 1);
}
}
}
$post = substr($text, 0, $char);
$post .= " …";
if($sinhtml){
return strip_tags($post);
}else{
-->         return $post;
}
}else{
return $text;
}
}

Введенный текст выглядит примерно так

<p> Some text… </p>
<ul>
<li>Technical Description</li>
<li>or Details (weight, size, etc.)</li>
<li>…</li>
</ul>
<p>may be some more text</p>

Функция html_cut() есть линия, которую я никогда раньше не видел и не знаю, что она делает … $ symbol = $ text {$ i}

function html_cut($text, $max_length)
{
$tags   = array();
$result = "";

$is_open   = false;
$grab_open = false;
$is_close  = false;
$in_double_quotes = false;
$in_single_quotes = false;
$tag = "";

$i = 0;
$stripped = 0;

$stripped_text = strip_tags($text);

while ($i < strlen($text) && $stripped < strlen($stripped_text) && $stripped < $max_length)
{
$symbol  = $text{$i};
$result .= $symbol;

switch ($symbol)
{
case '<':
$is_open   = true;
$grab_open = true;
break;

case '"':
if ($in_double_quotes)
$in_double_quotes = false;
else
$in_double_quotes = true;

break;

case "'":
if ($in_single_quotes)
$in_single_quotes = false;
else
$in_single_quotes = true;

break;

case '/':
if ($is_open && !$in_double_quotes && !$in_single_quotes)
{
$is_close  = true;
$is_open   = false;
$grab_open = false;
}

break;

case ' ':
if ($is_open)
$grab_open = false;
else
$stripped++;

break;

case '>':
if ($is_open)
{
$is_open   = false;
$grab_open = false;
array_push($tags, $tag);
$tag = "";
}
else if ($is_close)
{
$is_close = false;
array_pop($tags);
$tag = "";
}

break;

default:
if ($grab_open || $is_close)
$tag .= $symbol;

if (!$is_open && !$is_close)
$stripped++;
}

$i++;
}

while ($tags)
$result .= "</".array_pop($tags).">";

return $result;
}

0

Решение

Попробуйте использовать HTML-парсер
или же Аккуратный HTML.
Для проверки вложенных тегов

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]