在 DedeCMS 中,对字段值的截取主要通过两个核心函数实现:cn_substr() 和 substr(),它们适用于不同的场景。

cn_substr() - 强烈推荐(处理中英文混合)
这是 DedeCMS 内置的专用中文字符串截取函数,强烈推荐在所有情况下使用,它能正确处理 GBK/UTF-8 编码下的中文字符,避免出现乱码或截断半个汉字的问题。
语法
cn_substr($str, $length, $dot = '...')
$str: 要截取的字符串,通常是{field:字段名}的形式。$length: 要截取的字符长度(一个汉字、一个字母、一个数字都算一个字符)。$dot: (可选) 字符串末尾添加的省略符号,默认是 。
适用场景
- (
title) - (
description) - 自定义字段中的文本内容(如产品简介、新闻内容等)
使用示例
假设你的文章摘要字段 description 内容很长,你希望在首页或列表页只显示前 100 个字符,并在末尾加上 。
*在列表页模板 (`list_.htm) 或首页模板 (index.htm`) 中:**
{dede:list pagesize='10'}
<li>
<!-- 截取摘要字段,长度为100,省略号为... -->
[field:description function='cn_substr(@me, 100, "...")'/]
</li>
{/dede:list}
说明:

@me是 DedeCMS 模板中的特殊变量,代表当前正在处理的这个字段值。function='cn_substr(@me, 100, "...")'的意思是:对@me(即description的原始值)执行cn_substr()函数,参数分别是@me、100和 ...。
substr() - 仅限纯英文字符
这是 PHP 原生的字符串截取函数。不要直接用它来截取包含中文字符的字符串,因为在 GBK 编码下,一个汉字占 2 个字节,在 UTF-8 下占 3 个字节,直接使用 substr() 很容易导致乱码。
语法
substr($string, $start, $length)
$string: 输入的字符串。$start: 开始截取的位置(从 0 开始)。$length: (可选) 截取的长度。
适用场景
仅适用于确定内容为纯英文或数字的纯 ASCII 字符串,例如文章 ID、作者名(纯英文)等。
使用示例
假设你有一个自定义字段 english_content是纯英文的,你想从第 10 个字符开始,截取 50 个字符。
{dede:field.english_content function='substr(@me, 10, 50)'/}
注意: 这种用法非常不推荐,除非你 100% 确保字段内容不含任何中文或特殊符号。

高级用法:结合 strip_tags 过滤 HTML 标签
在实际应用中,我们截取的文本(如摘要 description)可能包含 HTML 标签(如 <p>、<br>、<a> 等),直接截取可能会导致 HTML 标签不完整,影响页面显示。
为了解决这个问题,我们可以将 strip_tags 函数与 cn_substr 结合使用。
语法
cn_substr(strip_tags($str), $length, $dot)
使用示例
并先过滤掉所有 HTML 标签。
{dede:list pagesize='10'}
<li>
<!-- 先用 strip_tags 去掉HTML标签,再用 cn_substr 截取 -->
[field:description function='cn_substr(strip_tags(@me), 100, "...")'/]
</li>
{/dede:list}
更优雅的写法(使用管道符 ):
DedeCMS 模板支持使用管道符 来链式调用函数,这样代码更清晰。
[field:description function='cn_substr(strip_tags(@me), 100, "...")'/] <!-- 等同于 --> [field:description|strip_tags|cn_substr=100,'...'/]
注意: 语法在旧版本中可能支持不完全,
function='...'的写法兼容性最好。
总结与最佳实践
| 函数 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
cn_substr() |
完美支持中英文混合,不会出现乱码 | 无 | 所有文本内容的截取,如标题、自定义文本字段 |
substr() |
PHP 原生函数,无需学习 | 截取中文会乱码 | 仅限纯英文/数字字段,如 ID、用户名(纯英文) |
strip_tags() |
过滤 HTML 标签 | 单独使用不能截取长度 | 需与 cn_substr() 配合使用,用于清理 HTML |
核心要点:
- 默认使用
cn_substr(),这是 DedeCMS 开发者的最佳实践。 - 截取前先过滤 HTML:对于可能包含 HTML 标签的字段(如
description),务必先使用strip_tags()清理,再进行截取。 - 使用
@me:在function属性中,@me代表当前字段的原始值,这是传递给函数的参数。
通过掌握这些方法,你就可以在 DedeCMS 中灵活、安全地对任何字段进行截取了。
