核心函数:cn_substr()
cn_substr() 是 DedeCMS 专门为处理中文字符串而设计的函数,是进行字符截取的首选。

(图片来源网络,侵删)
语法
cn_substr($str, $start, $length)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
$str |
string | 是 | 需要被截取的原始字符串。 |
$start |
integer | 是 | 开始截取的位置(索引),从 0 开始计数。$start = 0 表示从字符串开头截取;$start = 1 表示从第二个字符开始。 |
$length |
integer | 是 | 需要截取的字符长度。 |
重要提示:
- 中文字符算一个:
$length参数计算的是“字符”数,而不是字节数,一个汉字、一个字母、一个数字都算作一个字符,这解决了substr()截取中文时可能出现的乱码问题。 - 编码支持:此函数默认支持
UTF-8编码,这也是 DedeCMS 最常用的编码,如果你的网站是GBK编码,DedeCMS 也提供了对应的函数cn_substrgb()。
使用示例
假设我们有以下变量:
$title = "这是一个DedeCMS字符截取的测试标题,用于演示。";
示例 1:从开头截取指定长度
需求:只显示标题的前 10 个字符。
代码:

(图片来源网络,侵删)
{dede:field.title function='cn_substr(@me, 0, 10)'/}
或者直接在模板里写(不推荐,因为 function 更规范):
<?php echo cn_substr($title, 0, 10); ?>
输出结果:
这是一个DedeC
注意:@me 在 DedeCMS 的 function 属性中代表当前字段的原始值。
示例 2:从指定位置开始截取
需求:跳过前 6 个字符,从第 7 个字符开始,截取 8 个字符。

(图片来源网络,侵删)
代码:
{dede:field.title function='cn_substr(@me, 6, 8)'/}
输出结果:
字符截取的测
示例 3:截取并添加省略号(最常用)
这是列表页最常见的用法,当标题过长时,截取一部分并加上 "..."。
需求超过 20 个字符时,只显示前 20 个字符,并添加 "..."。
代码:
{dede:field.title function='cn_substr(@me, 0, 20)'}...
或者使用 if 条件判断,让 "..." 只在标题被截断时显示(更严谨):
{dede:field.title runphp='yes'}
if(strlen($cfg_soft_lang) == 'utf-8') {
$length = 20;
} else {
$length = 10; // GBK编码下,长度可以设小一些
}
if (mb_strlen(@me, 'UTF-8') > $length) {
@me = cn_substr(@me, 0, $length) . '...';
}
{/dede:field.title}
说明:
runphp='yes'允许在模板标签内执行 PHP 代码。@me在这里同样代表原始的field.title值。mb_strlen()用来获取字符串的真实长度,以便判断是否需要截断。cn_substr()用于执行截断操作。
输出结果($title 超过20字符):
这是一个DedeCMS字符截取的测试标...
相关函数:cn_substrgb()
如果你的 DedeCMS 网站是 GBK 编码,你应该使用 cn_substrgb() 函数,它的用法和 cn_substr() 完全一样,只是内部处理方式适配了 GBK 编码。
语法
cn_substrgb($str, $start, $length)
使用示例
假设网站是 GBK 编码,截取标题前 10 个字符:
{dede:field.title function='cn_substrgb(@me, 0, 10)'/}
与 PHP 原生函数 substr() 的对比
了解 cn_substr() 的优势,最好和 PHP 自带的 substr() 对比一下。
| 特性 | cn_substr() (DedeCMS) |
substr() (PHP原生) |
|---|---|---|
| 编码安全 | 高,专为中文设计,支持 UTF-8/GBK,不会乱码。 | 低,按字节截取,在 UTF-8 下一个汉字可能占 3 个字节,直接截取会导致乱码。 |
| 字符计数 | 按字符数,一个汉字、一个字母都算 1。 | 按字节数,在 UTF-8 下,汉字算 3,字母算 1。 |
| 适用场景 | DedeCMS 模板中处理所有文本,特别是中文。 | 简单的、纯英文的字符串处理,或在 PHP 代码中已确保编码安全时使用。 |
substr() 乱码示例
$title = "你好,世界"; // UTF-8编码 // 一个汉字3个字节,"你好"共6个字节 echo substr($title, 0, 6); // 输出: 你好 echo substr($title, 0, 7); // 输出: 你好,世 (最后一个“世”字被截断了,可能出现乱码或奇怪的符号)
而使用 cn_substr() 则完全不会出现这个问题:
echo cn_substr($title, 0, 2); // 输出: 你好 echo cn_substr($title, 0, 3); // 输出: 你好,
在 DedeCMS 中进行字符截取,请遵循以下原则:
- 首选
cn_substr():无论在模板标签的function属性里,还是在 PHP 代码中,处理中文内容都应优先使用此函数。 - 注意编码:确认你的网站是
UTF-8还是GBK编码,选择对应的函数 (cn_substr或cn_substrgb),现在绝大多数新站都是UTF-8。 - 添加省略号:在列表页等场景,截取后添加 是提升用户体验的好方法,记得用
if判断来确保只在需要时添加。 - 避免使用
substr():在 DedeCMS 环境下处理中文,直接使用substr()几乎肯定会带来乱码风险,请务必使用cn_substr()。
希望这个详细的解释能帮助你完全掌握 DedeCMS 的字符截取功能!
