PHP mb_substr问题与截断文本

时间:2018-10-04 10:42:22

标签: php phalcon

我有一个将文本截断的功能,如下所示:

public function truncateText($text, $val)
    {
        if(strlen($text) > $val){
            $content = mb_substr($text, 0, $val) . '...';
            return $content;
        } else {
            return $text;
        }
    }

我遇到了多字节字符的问题。即使我使用的是mb_substring,我仍然在文本结尾处得到奇怪的字符。 我的mb_internal_encoding是UTF-8。

一个例子如下:

存储在数据库中的字符串是:

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

当我使用truncateText运行此字符串时,我得到以下带有amp字母的内容:

Lorem ipsum dolor坐着,安全奉献精英。 Praesent malesuada pretium justo,非伪造。 Orci varius natoque penatibus et magnis dis parturient montes,nascetur ridiculus mus。 Aliquam iaculis nulla velit,eget accum&...

$this->tag->truncateText($text, 250);

但是,如果我直接使用文本进行测试而不从数据库中获取文本并且没有

标记,则截断是很好的。我尝试了从数据库中获得的字符串中的strip_tags,但还是没有。

存储在数据库中的上述字符串的var_dump:

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

"

html特殊字符的var_dump:

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> "

我在这里想念什么?

非常感谢, 特里克斯

2 个答案:

答案 0 :(得分:1)

在数据库适配器配置中添加“选项”:

use Phalcon\Db\Adapter\Pdo\Mysql;

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

答案 1 :(得分:0)

设法解决问题。我重新编写了我的函数,现在是它的功能了。

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;
    }
}

非常感谢您的建议和帮助。 特里克斯