菜鸟科技网

dedecms内容页调用如何限制字数?

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

dedecms内容页调用如何限制字数?-图1
(图片来源网络,侵删)

使用系统自带的cn_substr函数

dedecms内置了cn_substr函数,专门用于截取字符串并支持中英文混合,该函数的语法为:cn_substr($str, $start, $len),其中$str为原始字符串,$start为起始位置(通常为0),$len为截取长度,在内容页调用时,可以通过以下代码限制摘要显示100个字符:

{dede:field name='body' function='cn_substr(@me, 100)'/}

注意事项

  1. 该函数默认按字节截取,一个中文字符占2个字节,一个英文字符占1个字节。
  2. 如果截取位置在单词中间,可能会出现乱码,建议配合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);
    }
}

在模板中调用时:

dedecms内容页调用如何限制字数?-图2
(图片来源网络,侵删)
{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>

适用场景

dedecms内容页调用如何限制字数?-图3
(图片来源网络,侵删)
  • 适用于移动端或对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_substrmb_substr 简单高效,适合SEO优化。
动态交互需求 JavaScript截取 灵活性高,可结合用户行为触发。
移动端适配 CSS截断 减少服务器压力,响应式布局友好。

常见问题与解决方案

  1. 截取后出现乱码

    • 原因:字符编码不匹配或截断位置在多字节字符中间。
    • 解决:使用mb_substr并明确指定编码(如utf-8),或结合mb_check_encoding校验。
  2. 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项目的具体需求灵活选择适合的字数限制方案,确保内容展示的准确性和用户体验的优化。

分享:
扫描分享到社交APP
上一篇
下一篇