Typecho 主题修改:实现内容摘要与截断
一、初始状态
默认主题中的代码如下:
<?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>';
}
?>