dede如何截取指定长度的字符串?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 DEDE建站 正文

核心函数:cn_substr()

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

dede字符截取字符串
(图片来源网络,侵删)

语法

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字符截取字符串
(图片来源网络,侵删)
{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字符截取字符串
(图片来源网络,侵删)

代码

{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 中进行字符截取,请遵循以下原则:

  1. 首选 cn_substr():无论在模板标签的 function 属性里,还是在 PHP 代码中,处理中文内容都应优先使用此函数。
  2. 注意编码:确认你的网站是 UTF-8 还是 GBK 编码,选择对应的函数 (cn_substrcn_substrgb),现在绝大多数新站都是 UTF-8
  3. 添加省略号:在列表页等场景,截取后添加 是提升用户体验的好方法,记得用 if 判断来确保只在需要时添加。
  4. 避免使用 substr():在 DedeCMS 环境下处理中文,直接使用 substr() 几乎肯定会带来乱码风险,请务必使用 cn_substr()

希望这个详细的解释能帮助你完全掌握 DedeCMS 的字符截取功能!

-- 展开阅读全文 --
头像
织梦dede文件夹替换后需注意什么?
« 上一篇 今天
织梦调用指定二级栏目
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]