使用织梦内置的 cn_substr 函数(最常用)
这是织梦官方提供的、最简单直接的字符串截取函数,它可以将标题截取到指定的长度,并可以添加自定义的结尾字符串。

(图片来源网络,侵删)
语法
[field:function=cn_substr(@me, '截取长度', '结尾字符串')/]
@me:这是当前字段的值,在这里就是[field:title/]的内容。'截取长度':你想要显示的标题字符数,20。'结尾字符串'被截断后,在末尾添加的字符串,通常是 ,如果不需要,可以省略。
示例
假设你有一个文章列表,想在首页显示标题,但限制标题在 20个字符 以内,超过则显示 。
在首页或列表页的循环标签 {dede:list} 或 {dede:arclist} 内使用:
{dede:list pagesize='10'}
<li>
<!-- 调用标题,限制20个字符,超出部分用...代替 -->
<a href="[field:arcurl/]">[field:function=cn_substr(@me, 20, '...')/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
在 {dede:arclist} 中使用:
{dede:arclist typeid='1' row='8'}
<div class="news-item">
<h3><a href="[field:arcurl/]">[field:function=cn_substr(@me, 30, '...')/]</a></h3>
<p>[field:description function=cn_substr(@me, 100, '...')/]</p>
</div>
{/dede:arclist}
优点:

(图片来源网络,侵删)
- 简单易用,官方原生支持。
- 性能较好,直接在PHP层面处理。
缺点:
- 它是按 字节 截取的,而不是按 字符,对于纯英文字符没问题,但如果包含中文,一个汉字通常占2-3个字节,如果你设置为
20,实际显示的汉字可能只有9-10个,对于GBK编码的织梦,这个函数在处理中文时表现尚可,对于UTF-8编码,需要更精确的方法。
使用自定义函数(推荐,更精确)
如果你使用的是UTF-8编码的织梦,或者需要更精确地按 字符数(而不是字节数)截取,强烈推荐使用自定义函数,这种方法最灵活、最准确。
步骤
创建自定义函数文件
在 include/ 目录下创建一个名为 helper.helper.php 的文件(如果已存在则直接编辑),如果文件名不同,请确保在织梦后台的“系统” -> “系统基本参数” -> “核心设置”中,自定义函数类文件 的路径是正确的。

(图片来源网络,侵删)
在 helper.helper.php 文件中添加以下函数:
<?php
if(!defined('DEDEINC')) exit('Request Error!');
/**
* 按字符数截取字符串,并支持添加结尾字符
* @param string $str 要截取的字符串
* @param int $length 截取的长度
* @param string $suffix 结尾字符,如 '...'
* @return string
*/
function cutstr_utf8($str, $length, $suffix = '...') {
if (strlen($str) <= $length) {
return $str;
}
$str = substr($str, 0, $length);
return $str . $suffix;
}
?>
在模板中调用
现在你可以在任何模板文件中使用这个新函数了。
在 {dede:list} 中使用:
{dede:list pagesize='10'}
<li>
<!-- 调用标题,限制为10个字符,精确按字符数计算 -->
<a href="[field:arcurl/]">[field:php]echo cutstr_utf8($ctitle, 10, '...');[/field:php]</a>
</li>
{/dede:list}
或者使用 function 参数(推荐方式):
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:function='cutstr_utf8(@me, 10, "...")'/]</a>
</li>
{/dede:list}
说明:
$ctitle是{dede:list}标签里的一个变量,代表当前文章的标题。@me是{dede:arclist}或[field:xxx]标签中的通用变量,代表当前字段的值。cutstr_utf8就是我们刚才创建的函数名。
优点:
- 精确控制:按字符数截取,对中英文混合排版非常友好。
- 灵活性强:可以添加任何你想要的逻辑,比如判断是否真的需要截断等。
- 适用于UTF-8:完美解决UTF-8编码下的截取问题。
缺点:
- 需要手动修改文件,对新手来说稍微复杂一点。
使用CSS实现(纯前端方案)
这种方法不改变标题本身的值,只是在前端显示时进行隐藏,优点是简单,不涉及后端代码修改。
语法
使用CSS的 text-overflow 属性。
/* 1. 必须是块级元素 */
display: block; /* 或 inline-block */
/* 2. 禁止换行 */
white-space: nowrap;
/* 3. 溢出部分隐藏 */
overflow: hidden;
/* 4. 用省略号代替被隐藏的部分 */
text-overflow: ellipsis;
/* 5. 设置一个最大宽度,这是关键 */
width: 200px; /* 根据你的布局设定具体宽度 */
}
在模板中的使用
{dede:list pagesize='10'}
<li>
<!-- 直接调用完整标题,用CSS控制显示 -->
<a href="[field:arcurl/]" class="title-limit">[field:title/]</a>
</li>
{/dede:list}
优点:
- 实现简单,只需添加CSS类,本身的完整性和SEO搜索引擎抓取。
- 适用于所有编码。
缺点:
- 不精确:不能指定具体的字符数,而是由容器的宽度决定,在不同屏幕尺寸下,显示的字符数可能不同。
- 只适用于单行需要换行,此方法不适用。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
cn_substr 函数 |
简单,官方原生,性能好 | 按字节截取,对中文不精确 | GBK编码项目,对字符数要求不高的场景 |
| 自定义函数 | 精确按字符数,灵活,适用于UTF-8 | 需要修改PHP文件,对新手有门槛 | 强烈推荐,特别是UTF-8项目,需要精确控制标题长度 |
| CSS方案 | 简单,不影响SEO,不修改代码 | 不精确,依赖容器宽度,仅限单行 | 长度要求不严格,或者由布局决定宽度的场景 |
给您的建议:
- 如果您的织梦是 GBK 编码,且标题长度要求不苛刻,直接使用 方法一 (
cn_substr) 就足够了。 - 如果您的织梦是 UTF-8 编码,或者您需要非常精确地控制显示的 中文字符数量,请使用 方法二(自定义函数),这是最专业和最可靠的解决方案。
- 如果您只是想快速实现一个简单的省略效果,并且标题长度由版面宽度决定,可以使用 方法三(CSS) 作为辅助。
