joomla — PHP mb_strlen не возвращает правильное количество символов

Я пытаюсь заставить мой веб-сайт 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 (которое не должно меняться). Мысли?

0

Решение

$ 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.

Итак, у вас есть варианты:

  • пренебрегайте тегами html и отображайте обычный текст (но вы можете заключить его в теги html, такие как p, span, div … и stylize) длиной 400 символов
  • использовать сложный механизм разделения html-тегов и показа контента. (это включает preg_match и replace, будьте уверены: вы не хотите этого делать)
1

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

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

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