PHP mb_substr与截断文本有关的问题

PHP mb_substr与截断文本有关的问题,php,phalcon,Php,Phalcon,我有一个截断文本的函数,如下所示: public function truncateText($text, $val) { if(strlen($text) > $val){ $content = mb_substr($text, 0, $val) . '...'; return $content; } else { return $text; } }

我有一个截断文本的函数,如下所示:

public function truncateText($text, $val)
    {
        if(strlen($text) > $val){
            $content = mb_substr($text, 0, $val) . '...';
            return $content;
        } else {
            return $text;
        }
    }
我有多字节字符的问题。即使我使用mb_子字符串,我仍然会在文本末尾出现奇怪的字符。 我的mb_内部编码是UTF-8

一个例子如下:

public function truncateText($text, $val)
    {
        if(strlen($text) > $val){
            $content = mb_substr($text, 0, $val) . '...';
            return $content;
        } else {
            return $text;
        }
    }
数据库中存储的字符串为:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada pretium justo, non posuere enim semper vel. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam iaculis nulla velit, eget accumááááá.</p>
但是,如果我直接用文本测试它,而不从数据库中获取它,也不使用标记,那么截断就很好了。我尝试了从数据库中获取的字符串中的strip_标记,但仍然没有任何结果

存储在数据库中的所述字符串的var_转储:

string(925) "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada pretium justo, non posuere enim semper vel. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam iaculis nulla velit, eget accumááááá.

"
htmlspecialcharacters的变量\u转储:

string(949) "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada pretium justo, non posuere enim semper vel. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam iaculis nulla velit, eget accum&aacute;&aacute;&aacute.</p> "
string(949)“Lorem ipsum door sit amet,adipiscing elite.present malesuada pretium justo,non posuere enim semper vel.Orci varius natoque penatibus and magnis dis parturint montes,nascetur ridiculus mus.Aliquam iaculis nulla velit,eget accumá;á;á.

我错过了什么

非常感谢,,
Trix在数据库适配器配置中添加“选项”:

use Phalcon\Db\Adapter\Pdo\Mysql;

$db = new Mysql(
     /* ... */
     'options'  => [
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
      ]
   );  

设法解决了这个问题。我重写了一点函数,现在它完成了

public function truncateText($text, $val)
{
    if(mb_strlen($text) > $val){
        $content = mb_substr(html_entity_decode(str_ireplace(['<p>','</p>'],'',$text)), 0, $val) . '...';
        return $content;
    } else {
        return $text;
    }
}
公共函数truncateText($text,$val)
{
如果(mb_strlen($text)>$val){
$content=mb_substr(html_entity_decode(str_ireplace(['','

'],''.'$text)),0,$val); 返回$content; }否则{ 返回$text; } }
谢谢你的建议和帮助,非常感谢。
Trix

你能在从数据库中获取该字符串后立即发布该字符串的var_转储吗?在截断之前?听起来你好像做错了什么,比如在数据库中存储HTML实体。Updatet post带有var_转储。奇怪的是,他的代码在php cli上运行良好。测试它时,他的字符串和函数没有任何问题。在浏览器的源代码视图中检查该var_转储的输出,在您的浏览器已将其解释为HTML之后。(或者使用
echo htmlspecialchars($value)
生成调试输出。)