【问题标题】:PHP mb_substr issues with truncate text截断文本的 PHP mb_substr 问题
【发布时间】:2019-03-09 17:30:02
【问题描述】:

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

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

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

我在这里错过了什么?

非常感谢, 三重奏

【问题讨论】:

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

标签: php phalcon


【解决方案1】:

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

use Phalcon\Db\Adapter\Pdo\Mysql;

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

【讨论】:

    【解决方案2】:

    设法解决了问题。我稍微重写了我的函数,现在可以了。

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

    感谢您的建议和帮助,真的很感激。 三重奏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2014-10-21
      • 2016-12-02
      • 2010-12-03
      • 2016-12-04
      相关资源
      最近更新 更多