导航菜单
登录 注册

默认主题下,Typecho 侧边栏里输出最新评论的代码是

$comments->content();

如果屏论非常长,还带图片的,侧边栏会显示的异常难看。我们一般会改成:

$comments->excerpt(20, '...'); // 假设主题适配最长 20 个字符,然后后边加上 ...

但是看过源码的都知道,excerpt函数会去除所有的 HTML 标签。

public function excerpt(int $length = 100, string $trim = '...')
{
    echo Common::subStr(strip_tags($this->content), 0, $length, $trim);
}

那么有没有保留表情还能截取呢?只能获取评论内容自己截取了,下边是我让 GPT 写的一个函数,放到functions.php里,然后再需要截取评论内容的地方调用即可。

function truncate_comment(string $text, int $length, string $ellipsis = '...'): string
{
    $text = strip_tags($text, '<img>');
    // 如果文本长度超过指定长度
    if (mb_strlen($text, 'UTF-8') > $length) {
        $truncated = '';
        $currentLength = 0;

        // 使用正则表达式匹配 <img> 标签和其他文本
        preg_match_all('/<img[^>]*>|[^<]+/', $text, $matches);

        foreach ($matches[0] as $part) {
            if (strpos($part, '<img') !== false) {
                // 如果是 <img> 标签,直接添加并跳过长度计算
                $truncated .= $part;
            } else {
                // 如果是文本,计算其长度
                $partLength = mb_strlen($part, 'UTF-8');

                // 检查是否超出指定长度
                if ($currentLength + $partLength > $length) {
                    // 截断文本并添加省略号
                    $truncated .= mb_substr($part, 0, $length - $currentLength, 'UTF-8') . '...';
                    break;
                } else {
                    $truncated .= $part;
                    $currentLength += $partLength;
                }
            }
        }

        return $truncated . ' ' . $ellipsis;
    }

    return $text . ' ' . $ellipsis;
}

调用方式

truncate_comment($comments->content, 20, '。。。')
BeaconNav:导航类型主题
上一篇
手握13亿文档,豆丁网100万元被“贱卖”
下一篇
广告