使用官方推荐标签(最安全、最规范)
这是DedeCMS官方文档中推荐的方法,兼容性最好,也最不容易出错,它通过 {dede:field} 标签的 function 属性来调用PHP函数进行截取。

(图片来源网络,侵删)
场景1:限制文章标题的字数
目标:调用“分类ID”为 1 的文章列表,只显示标题,且标题最多显示 20 个字符。
代码示例:
{dede:arclist typeid='1' titlelen='50' orderby='pubdate' row='10'}
<li>
<a href="[field:arcurl/]">[field:title function='cn_substr(@me,20)'/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"]</span>
</li>
{/dede:arclist}
代码详解:
{dede:arclist ...}:这是调用文章列表的主标签。typeid='1':指定要调用的分类ID,请将1替换为您自己的分类ID。titlelen='50':这个属性是在数据库查询时就限制标题的长度,主要用于列表页显示完整标题,我们这里更推荐用下面的function来做最终显示,所以这个值可以设大一些或省略。orderby='pubdate':按发布时间降序排列,你也可以用click(点击量)、id(文章ID) 等。row='10':获取 10 条文章记录。
[field:arcurl/]:文章的链接地址。[field:title function='cn_substr(@me,20)'/]:这是实现标题截取的核心。field:title:获取文章标题的字段内容。function='...':对获取到的内容执行一个PHP函数。cn_substr(@me,20):这是一个DedeCMS内置的PHP函数。@me:代表当前标签的原始值,也就是field:title的完整内容。20:表示截取前 20 个字符。- 注意:
cn_substr是一个按字节截取的函数,对于英文字符和半角符号算1个字节,对于中文字符算2个字节,20个字节大约等于10个汉字,如果你希望按“字”来截取(比如20个汉字),可以使用mb_substr函数(需要服务器开启mbstring扩展)。
[field:pubdate function="MyDate('Y-m-d',@me)"]:格式化发布日期。
场景2:限制文章摘要(简介)的字数
目标:调用“分类ID”为 1 的文章列表,显示文章摘要,且摘要最多显示 100 个字符。

(图片来源网络,侵删)
代码示例:
{dede:arclist typeid='1' orderby='pubdate' row='5'}
<div class="article-item">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>[field:description function='cn_substr(@me,100)'/]...</p>
</div>
{/dede:arclist}
代码详解:
[field:description function='cn_substr(@me,100)'/]截取类似,这里是对文章的摘要(description字段)进行截取。@me是field:description的完整内容。100是截取的字节长度。- 最后手动加上 表示摘要被截断了,这是一个很好的用户体验习惯。
使用自定义函数(更灵活,推荐用于摘要)
当 cn_substr 无法满足需求时(比如需要处理特殊符号、或者需要更复杂的逻辑),我们可以自定义一个PHP函数,然后在模板中调用它,这种方法尤其适合处理文章摘要。
步骤1:在 /include/extend.func.php 文件中添加自定义函数
请用FTP或文件管理器打开您的网站根目录下的 /include/extend.func.php 文件,如果这个文件不存在,请自行创建,在文件末尾 ?> 的前面,添加以下代码:

(图片来源网络,侵删)
/**
* 截取字符串并过滤掉HTML标签
* @param string $str 需要截取的字符串
* @param int $length 截取长度
* @param string $dot 结尾符号
* @return string
*/
function cutstr_html($str, $length, $dot = '...')
{
// 1. 先去除HTML标签
$str = strip_tags($str);
// 2. 去除多余的空白和换行
$str = preg_replace('/\s/', '', $str);
// 3. 使用DedeCMS自带的cn_substr函数进行截取
// (如果你的环境支持mbstring,也可以使用 mb_substr($str, 0, $length, 'utf-8') )
$str = cn_substr($str, $length);
// 4. 如果原始长度大于截取长度,则添加结尾符号
if (strlen($str) > $length) {
$str .= $dot;
}
return $str;
}
函数说明:
这个函数 cutstr_html 会先清除掉所有的HTML标签(<p>, <a> 等),然后再进行截取,这样可以避免HTML标签被截断导致页面样式错乱。
步骤2:在模板中调用自定义函数
你可以在任何模板文件中使用这个新函数了。
代码示例:
{dede:arclist typeid='2' row='8' orderby='pubdate'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<p>
[field:body function='cutstr_html(@me, 150)'/] <!-- 注意:这里用的是 body 字段,它包含了文章的完整内容 -->
</p>
</li>
{/dede:arclist}
代码详解:
[field:body function='cutstr_html(@me, 150)'/]:- 我们这里使用了
field:body,因为它包含了文章的完整内容(不含HTML标签的话,description也可以,但body更通用)。 function='cutstr_html(@me, 150)':调用我们刚刚在extend.func.php中定义的函数。@me是field:body的完整内容。150是我们希望截取的字节长度。- 函数会自动处理掉HTML标签并添加 。
- 我们这里使用了
总结与建议
| 需求场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 字数 | [field:title function='cn_substr(@me,N)'/] |
简单、高效、官方推荐 | 按字节截取,对中文处理可能不直观 |
| 限制摘要字数 | 自定义函数 cutstr_html |
最灵活、最健壮,能过滤HTML,避免页面错乱 | 需要修改PHP文件,对新手稍复杂 |
| 简单截取摘要 | [field:description function='cn_substr(@me,N)'/] |
简单直接 | 如果摘要里有HTML标签,可能被截断 |
给您的建议:
- :直接使用方法一的
cn_substr即可,非常方便。 - 限制摘要/内容:强烈推荐使用方法二(自定义函数),虽然多了一步操作,但它能从根本上解决因HTML标签被截断而导致的页面布局混乱问题,是更专业、更稳妥的做法。
希望这个详细的教程能帮助到您!
