PHP mb_strlen 未返回正确的字符数

PHP mb_strlen not returning correct character count

我正在尝试让我的 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->introtext

内容干净吗?即如果它包含 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 标记保留在子字符串中,您永远不知道子字符串是否包含结束标记,这可能会给 [=53= 带来更多麻烦] 结构体。

所以,您有多种选择::

  • 忽略 html 标签并显示字符长度的纯文本(但您仍然可以用 html 标签将其括起来,例如 p、span、div... 和风格化) 400
  • 使用分离 html 标签和显示内容的复杂机制。 (这涉及 preg_match 和替换,肯定的是:你不想这样做)