在dedecms系统中,调用内容页并限制字数是网站开发中常见的需求,特别是在首页、列表页或自定义页面中需要展示内容摘要时,dedecms提供了多种方法来实现这一功能,开发者可以根据实际需求选择最适合的方式,以下是几种常用的限制字数的方法及其详细说明。

使用系统自带的cn_substr
函数
dedecms内置了cn_substr
函数,专门用于截取字符串并支持中英文混合,该函数的语法为:cn_substr($str, $start, $len)
,其中$str
为原始字符串,$start
为起始位置(通常为0),$len
为截取长度,在内容页调用时,可以通过以下代码限制摘要显示100个字符:
{dede:field name='body' function='cn_substr(@me, 100)'/}
注意事项:
- 该函数默认按字节截取,一个中文字符占2个字节,一个英文字符占1个字节。
- 如果截取位置在单词中间,可能会出现乱码,建议配合
strip_tags
函数去除HTML标签后再截取:{dede:field name='body' function='cn_substr(strip_tags(@me), 100)'/}
使用mb_substr
函数(推荐)
对于需要更精准控制中文字符截取的场景,可以使用PHP的mb_substr
函数(需开启mbstring扩展),通过自定义函数实现,例如在include/helpers/extend.helper.php
中添加以下代码:
if (!function_exists('dede_mb_substr')) { function dede_mb_substr($str, $start, $len, $encoding = 'utf-8') { return mb_substr($str, $start, $len, $encoding); } }
在模板中调用时:

{dede:field name='body' function='dede_mb_substr(@me, 0, 100, "utf-8")'/}
优势:
- 支持多种字符编码,避免乱码问题。
- 可精确按字符数截取,适合中英文混合内容。
通过CSS控制显示字数(纯前端方案)
如果不需要截取字符串本身,仅通过CSS隐藏多余内容,可以使用-webkit-line-clamp
属性,限制显示3行文本:
.limit-lines { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; text-overflow: ellipsis; }
在模板中直接输出完整内容并添加类名:
<div class="limit-lines">{dede:field name='body'/}</div>
适用场景:

- 适用于移动端或对SEO要求不高的场景。
- 缺点:无法精确控制字符数,且可能影响页面加载性能。
使用GetOneArc
结合SQL查询
在自定义页面或列表页中,若需调用内容页摘要,可通过GetOneArc
函数获取单篇内容并截取。
{dede:sql sql="SELECT body FROM dede_archives WHERE id=1"} [field:body function='cn_substr(@me, 100)'/] {/dede:sql}
注意事项:
- 需确保数据库表前缀正确(默认为
dede_
)。 - 建议结合缓存机制减少数据库压力。
结合JavaScript动态截取
对于需要动态交互的场景(如点击展开全文),可使用JavaScript实现。
<div id="summary">原始内容...</div> <script> document.getElementById('summary').innerText = document.getElementById('summary').innerText.substring(0, 100) + '...'; </script>
优化建议:
- 避免频繁操作DOM,可使用事件委托或懒加载技术。
- 注意XSS防护,对输出内容进行转义。
不同场景下的选择建议
场景 | 推荐方法 | 原因 |
---|---|---|
静态首页/列表页摘要 | cn_substr 或mb_substr |
简单高效,适合SEO优化。 |
动态交互需求 | JavaScript截取 | 灵活性高,可结合用户行为触发。 |
移动端适配 | CSS截断 | 减少服务器压力,响应式布局友好。 |
常见问题与解决方案
-
截取后出现乱码
- 原因:字符编码不匹配或截断位置在多字节字符中间。
- 解决:使用
mb_substr
并明确指定编码(如utf-8
),或结合mb_check_encoding
校验。
-
HTML标签被破坏
- 原因:直接截取字符串可能破坏标签结构。
- 解决:先使用
strip_tags
去除标签,或使用preg_replace
过滤危险标签后再截取。
相关问答FAQs
Q1: 如何在dedecms中调用内容页摘要并保留HTML格式?
A: 可使用正则表达式过滤掉不需要的标签(如<script>
、<style>
),再截取字符串。
{dede:field name='body' function='preg_replace("/<[^>]+>/", "", @me)'/} {dede:field name='body' function='cn_substr(@me, 100)'/}
Q2: 为什么用cn_substr
截取中文时长度计算不准确?
A: cn_substr
默认按字节计算,而中文字符在UTF-8编码下占3字节,建议改用mb_substr
并设置$len
为实际需要的字符数,
{dede:field name='body' function='mb_substr(@me, 0, 50, "utf-8")'/}
通过以上方法,开发者可以根据dedecms项目的具体需求灵活选择适合的字数限制方案,确保内容展示的准确性和用户体验的优化。