Решение, которое я придумал, похоже на метод jheddings.
Я исправил его скрипт и использовал фрагмент кода, который нашел здесь
Snipplr Закрыть теги во фрагменте HTML
Чтобы найти открытые теги и закрыть их (обратите внимание, что я предполагаю, что вы действительно заботитесь только о закрытии тегов p)
Примечание: фрагмент может иметь недостатки, но ему удалось выполнить работу для примера, с которым я работал
Таким образом, в приведенном ниже примере сценария я беру образец рекламного ролика, вырезая все после маркера разрыва и добавляя к нему «...» Затем мы раздеваем все, кроме тегов p. Затем я использую функцию closetags, чтобы сопоставить все теги и закрыть все несопоставленные.
Это далеко не аккуратно, но если ваш набор данных достаточно прост, это может быть быстрый способ сделать это.
<?php
$project_blurb = "<p>This is a blurb with content</p><p>This is another<!-- break -->blurb</p>";
if ($pos = strpos($project_blurb, '<!-- break -->')) {
$project_desc = substr($project_blurb, 0, $pos)."...";
} else {
$project_desc = $project_blurb;
}
$project_desc = strip_tags($project_desc, '<p>');
$project_desc = closetags($project_desc);
echo $project_desc;
function closetags ( $html )
{
#put all opened tags into an array
preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
$openedtags = $result[1];
#put all closed tags into an array
preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
$closedtags = $result[1];
$len_opened = count ( $openedtags );
# all tags are closed
if( count ( $closedtags ) == $len_opened )
{
return $html;
}
$openedtags = array_reverse ( $openedtags );
# close tags
for( $i = 0; $i < $len_opened; $i++ )
{
if ( !in_array ( $openedtags[$i], $closedtags ) )
{
$html .= "</" . $openedtags[$i] . ">";
}
else
{
unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
}
}
return $html;
}
?>