dede me内容中如何精确截取指定字符数?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 DEDE建站 正文
  1. 在首页/列表页摘要中截取:使用DedeCMS自带的description
  2. 页(article_article.htm)中截取:使用cn_substr函数。
  3. 在自定义模板或循环中截取:使用htmlspecialcharscn_substr函数组合。

下面我将详细讲解这三种方法,并提供完整的代码示例。

dede me内容中截取字符数
(图片来源网络,侵删)

在首页/列表页截取(最常用)

这是最简单、最标准的方法,DedeCMS已经为我们做好了封装,在调用文章列表时,直接使用[field:description/]标签即可。

工作原理: [field:description/]标签会自动调用文章的“(在后台发布文章时填写),如果摘要为空,它会自动从文章正文中截取 **系统基本参数->核心设置** 中设置的“列表每篇文章摘要字数”(通常是250字节)作为摘要。

示例代码(在列表循环 arclist 中使用):

{dede:arclist row='10' titlelen='50'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>[field:description/]...</p>
  </li>
{/dede:arclist}

如何手动控制摘要字数? 如果你想在模板中直接控制摘要的字数,而不是依赖后台设置,可以使用function='html2text(@me)'来处理。

dede me内容中截取字符数
(图片来源网络,侵删)

示例代码(手动截取200个字符):

{dede:arclist row='10' titlelen='50'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>
      <!-- 
        function='cn_substr(html2text(@me), 200)'
        @me: 代表当前字段的值,这里是 [field:body/] 的内容
        html2text(): 将HTML标签(如<p>, <div>)去掉,只保留纯文本
        cn_substr(): 截取指定长度的字符串
        200: 截取的字符数
      -->
      [field:body function='cn_substr(html2text(@me), 200)'/]...
    </p>
  </li>
{/dede:arclist}

页(article_article.htm)截取

页,通常我们想在“相关文章”或“推荐文章”里截取内容摘要,这时可以直接使用cn_substr函数。

工作原理: cn_substr() 是DedeCMS的一个核心函数,用于从字符串开头截取指定长度的字符,它比PHP自带的substr()更智能,能更好地处理中英文混合和UTF-8编码。

示例代码(在文章内容页的相关文章循环中使用):

dede me内容中截取字符数
(图片来源网络,侵删)
{dede:likeart titlelen='42' row='10'}
  <li>
    <a href="[field:arcurl/]">[field:title/]</a>
    <p>
      <!-- 
        这里直接对[field:body/]进行截取
        cn_substr(@me, 150) 表示截取150个字符
      -->
      [field:body function='cn_substr(@me, 150)'/]...
    </p>
  </li>
{/dede:likeart}

在自定义循环或PHP代码中截取

当你使用{dede:sql}标签执行自定义SQL查询,或者在其他需要处理文章内容的地方,就需要手动组合使用htmlspecialcharscn_substr

工作原理:

  1. htmlspecialchars(): 安全起见,将HTML特殊字符(如 <, >, &)转换为HTML实体,防止XSS攻击。
  2. html2text(): (可选但推荐)移除所有HTML标签,得到纯文本。
  3. cn_substr(): 对处理后的纯文本进行截取。

示例代码(在 {dede:sql} 循环中使用):

假设你有一个自定义查询,需要获取文章ID、标题和内容,并截取内容摘要。

{dede:sql sql="SELECT id, title, body FROM `dede_archives` WHERE typeid=1 LIMIT 5"}
  <div class="custom-item">
    <h3><a href="/plus/view.php?aid=[field:id/]">[field:title/]</a></h3>
    <div class="summary">
      <!-- 
        1. @me 代表[field:body/]的原始值
        2. htmlspecialchars(@me) 对原始值进行HTML转义,防止XSS
        3. html2text(...) 移除转义后文本中的HTML标签
        4. cn_substr(...) 对纯文本进行截取,例如100个字符
      -->
      [field:body function='cn_substr(html2text(htmlspecialchars(@me)), 100)'/]...
    </div>
  </div>
{/dede:sql}

总结与最佳实践

场景 推荐方法 代码示例 说明
首页/列表页摘要 使用[field:description/]function组合 [field:body function='cn_substr(html2text(@me), 200)'/] 简单高效,function组合方式更灵活。
自定义SQL/复杂循环 htmlspecialchars + html2text + cn_substr function='cn_substr(html2text(htmlspecialchars(@me)), 100)' 最安全、最规范的方式,务必对未知来源的内容进行转义。

重要提示:

  • 字节 vs 字符:DedeCMS很多默认设置是基于“字节”的(一个汉字通常占3个字节),而cn_substr函数是基于“字符”的,在日常使用中,基于字符的截取更符合我们的直觉,推荐优先使用cn_substr
  • 编码问题:确保你的网站文件和数据库都是UTF-8编码,这样可以避免绝大多数乱码问题。
  • 安全性:对于任何用户输入或从数据库中获取并要在页面上显示的非纯文本内容,都强烈建议先用htmlspecialchars进行转义,这是防止XSS攻击的基本准则。
-- 展开阅读全文 --
头像
dede迅雷下载的东西存在哪个目录?
« 上一篇 2025-12-21
织梦include文件夹丢失怎么办?
下一篇 » 2025-12-21

相关文章

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