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标签计数(不应该更改)。想法?

$ item-> intotext

内容清洁吗?即,如果它包含HTML特殊字符,标签或任何其他元素,则除了VARCHAR值之外?

如果不是,则强烈建议在应用MB_SUBSTR()之前清洁内容。您可以将内容清洗为::

mb_strimwidth(strip_tags($item->introtext), 0, 400); //returns varchar substring of length 400 from first character. 

如果您愿意,您可以进一步清洁内容,例如删除htmlspecialchars,htmlentities ...

update

用::

替换代码
<?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标签并显示纯文本(但您仍然可以用p,span,div ... and stylelize等HTML标签封闭它的字符长度400
  • 使用分离HTML标签并显示内容的复杂机制。(这涉及preg_match并替换,要积极:您不想这样做)

最新更新