一、初始状态

默认主题中的代码如下:

<?php $this->content('- 阅读剩余部分 -');?>

这段代码只是简单地输出文章内容,并在末尾添加了一个固定的文本 “- 阅读剩余部分 -”,但没有实现根据内容长度进行截断以及动态显示剩余字数的功能。

二、第一次修改

为了实现能够兼容多种内容的截断,我们先尝试添加一些内容和编码的判断,来确定是否需要截断内容。修改后的代码如下:

<?php
$content = $this->content;
$utf8ContentLength = mb_strlen($content, 'utf-8');
if ($utf8ContentLength > 270) {
    $displayContent = mb_substr($content, 0, 270);
    $remainingLength = $utf8ContentLength - 270;
    echo $displayContent;
    echo '余'. $remainingLength. '字';
    echo '</br><p class="more"><a href="'. $this->permalink(). '" title="'. $this->title(). '">阅读全文</a></p>';
} else {
    echo $content;
}
?>

这段代码首先获取文章内容并计算其 UTF-8 编码下的长度。如果长度大于 270,则截取前 270 个字符显示,并在后面显示剩余字数和阅读全文链接;如果长度小于等于 270,则直接输出完整内容。

三、进一步优化

我们可以添加对 <!--more--> 标记的判断,以及处理文章中的图片标签。修改后的代码如下:

<?php
$content = $this->content;
$utf8ContentLength = mb_strlen($content, 'utf-8');

if (strpos($content, '<!--more-->')!== false || $utf8ContentLength < 270) {
    if ($utf8ContentLength > 0) {
        $displayLength = min(270, $utf8ContentLength);
        $displayContent = mb_substr($content, 0, $displayLength);
        $remainingLength = $utf8ContentLength - $displayLength;
        echo $displayContent;
        echo '余'. $remainingLength. '字';
        if ($remainingLength > 0) {
            echo '</br><p class="more"><a href="'. $this->permalink(). '" title="'. $this->title(). '">阅读全文</a></p>';
        }
    } else {
        echo '完';
    }
} else {
    $c = mb_substr($content, 0, 270, 'utf-8');
    $c = preg_replace('/<img.*?src=[\"\'].*?[\"\'].*?>/', '', $c);
    if (strpos($c, '<pre>')!== false) {
        echo $c, '</code></pre>', '余'. ($utf8ContentLength - 270). '字';
    } else {
        echo $c, '余'. ($utf8ContentLength - 270). '字';
    }
    echo '</br><p class="more"><a href="'. $this->permalink(). '" title="'. $this->title(). '">阅读全文</a></p>';
}
?>

首先判断文章内容中是否存在 <!--more--> 标记或者内容长度是否小于 270。如果是,则根据长度截取部分内容显示,并在后面显示剩余字数和阅读全文链接;如果不是,则截取前 270 个字符,同时去除其中的图片标签,并在截断处显示剩余字数和阅读全文链接。

四、完整代码


<?php
$content = $this->content;
$utf8ContentLength = mb_strlen($content, 'utf-8');

if (strpos($content, '<!--more-->')!== false || $utf8ContentLength < 270) {
    if ($utf8ContentLength > 0) {
        $displayLength = min(270, $utf8ContentLength);
        $displayContent = mb_substr($content, 0, $displayLength);
        $remainingLength = $utf8ContentLength - $displayLength;
        echo $displayContent;
        echo '余'. $remainingLength. '字';
        if ($remainingLength > 0) {
        echo '</br>','余'. $remainingLength. '字';
        echo '</br><p class="more"><a href="', $this->permalink(), '" title="', $this->title(), '">阅读全文</a></p>';
        }
    } else {
        echo '完';
    }
} else {
    $c = mb_substr($content, 0, 270, 'utf-8');
    $c = preg_replace('/<img.*?src=[\"\'].*?[\"\'].*?>/', '', $c);
    if (strpos($c, '<pre>')!== false) {
        echo $c, '</code></pre>', '</br>', '余'. ($utf8ContentLength - 270). '字';
    } else {
        echo $c,'</br>','余'. ($utf8ContentLength - 270). '字';
    }
    echo '</br><p class="more"><a href="', $this->permalink(), '" title="', $this->title(), '">阅读全文</a></p>';
}
?>

标签: none

添加新评论