0

我试图让我的 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标签计数(不应该改变)。想法?

4

1 回答 1

1

$项目->介绍

内容干净吗?即它是否包含 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 标签并显示字符长度为 400 的纯文本(但您仍然可以使用 html 标签,如 p、span、div 和 stylize 将其括起来)
  • 使用分离html标签和显示内容的复杂机制。(这涉及 preg_match 和 replace,是肯定的:你不想这样做)
于 2017-02-18T16:08:05.260 回答