Я пытаюсь заставить мой веб-сайт Joomla отображать определенное количество текста из статьи, показанной в модуле. Я использую следующий PHP:
<span class="rightintrotext" itemprop="introtext">
<?php
$length = 400;
if ( mb_strlen($item->introtext ) > $length ) :
echo ( mb_substr($item->introtext, 0, $length)) . " ... ";
?>
<?php
else :
echo $item->introtext;
?>
<?php
endif;
?>
</span>
То, что я предположил бы, показало бы первые 400 символов текста статьи, однако вместо этого это только приблизительно 253 символа. У меня практически нет опыта работы с PHP. Первоначально я использовал strlen, но читал в Интернете, что mb_strlen обойдет мою проблему, но между ними нет ничего особенного; оба отображают неправильное количество символов (оба одинаковы).
Редактировать: Если я включу содержащий <p>
тег и его стиль (автоматически сгенерированный Joomla) Это следующее:
<p style="margin: 0px 0px 15px; padding: 0px; text-align: justify; color: #000000; font-family: 'Open Sans', Arial, sans-serif; font-size: 14px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pharetra, leo suscipit feugiat faucibus, risus erat placerat lacus, a volutpat tellus libero a tortor. In sapien nisi, luctus sed nibh volutpat, egestas ullamcorper purus. Mauris egestas id
который составляет 402 символа, поэтому я предполагаю, что именно в этом заключается проблема.
Я думаю, что я мог бы просто сделать количество символов, которое я хочу + количество тегов html (которое не должно меняться). Мысли?
$ Item-> Вступительный
Содержимое чистое? т.е. если он содержит специальные символы html, теги или любые другие элементы, кроме значений varchar?
Если нет, то настоятельно рекомендуется очистить содержимое перед применением mb_substr (). Вы можете очистить содержимое как ::
mb_strimwidth(strip_tags($item->introtext), 0, 400); //returns varchar substring of length 400 from first character.
Вы можете очистить содержимое дальше, если хотите, например, удалить htmlspecialchars, htmlentities …
ОБНОВИТЬ
Замените ваш код на ::
<?php
$lenght = 400;
echo (mb_strlen($item->introtext)>$length) ? mb_strimwidth(strip_tags($item->introtext), 0, $length, "...") : $item->introtext;
?>
ОБНОВЛЕНИЕ 1
В отредактированной части вашего вопроса вы заявили, что хотите сохранить HTML-теги + показать 400 символов, это тяжелая работа.
Подстрока, которую вы создали, может влиять на содержимое как:
если вы разделяете теги html и контент, вы можете не знать, когда и где теги появятся, поскольку это динамический контент.
если вы сохраняете теги html внутри подстроки, вы никогда не узнаете, содержит ли подстрока закрывающие теги или нет, что может вызвать гораздо более серьезные проблемы со структурой html.
Итак, у вас есть варианты:
Других решений пока нет …