如何截取长字符串或HTML内容的一部分,并在末尾显示省略号?

📅 👁️ 70

在网站内容运营中,我们常常会遇到这样的情况:文章列表页需要显示内容的摘要,产品详情页需要展示简短的介绍,或者在某些特殊模块中,我们需要从冗长的文本或包含HTML标签的内容中截取一部分,并在末尾加上“…”来提示用户内容未完。这样做不仅能有效节省页面空间,保持版面整洁,更能提升用户阅读体验,吸引他们点击查看完整内容。

要实现这样的功能,如果每次都手动截取,无疑会耗费大量时间和精力。幸运的是,AnQiCMS 深知这些需求,在模板系统中内置了一系列强大且灵活的过滤器,能够帮助我们轻松完成长字符串和HTML内容的截取与省略号显示,而且无需编写复杂的代码。

AnQiCMS 模板引擎提供的核心过滤器包括:

  • truncatechars: 适用于纯文本内容,根据指定的字符数量进行截取。
  • truncatewords: 适用于纯文本内容,根据指定的单词数量进行截取。
  • truncatechars_html: 专门用于包含HTML标签的内容,按字符数量截取,同时智能地保持HTML结构的完整性。
  • truncatewords_html: 同样用于包含HTML标签的内容,按单词数量截取,并确保HTML标签的正确闭合。

所有这些过滤器在截取内容后,都会在末尾自动添加省略号(“…”),使内容展示更加专业和友好。

针对纯文本内容的截取:truncatecharstruncatewords

当我们需要处理的文章标题、简短描述等不包含任何HTML标签的纯文本时,truncatecharstruncatewords 是理想的选择。

按字符数截取:truncatechars

这个过滤器会从字符串开头开始计算字符,达到指定数量后进行截取,并在末尾添加省略号。值得注意的是,它在计数时会将省略号本身的三个字符计算在内。

{# 假设有一个纯文本变量 `article.Title`,内容为 "AnQiCMS是一款高效、可定制、易扩展的内容管理系统。" #}

{# 截取前10个字符,包括省略号 #}
{{ article.Title|truncatechars:10 }}
{# 预期输出: AnQiCMS是... #}

{# 截取前20个字符 #}
{{ article.Title|truncatechars:20 }}
{# 预期输出: AnQiCMS是一款高效、可定制、易扩展的... #}

在处理中文内容时,truncatechars 会按实际中文字符数量进行计数,一个中文字符算一个字符,非常符合直觉。

按单词数截取:truncatewords

如果你更倾向于按单词(以空格为分隔符)来截取内容,truncatewords 会是更好的选择。它会计算指定数量的单词后截取,并在末尾添加省略号。

{# 假设有一个纯文本变量 `article.Description`,内容为 "AnQiCMS is an enterprise-grade content management system developed using Go language." #}

{# 截取前5个单词 #}
{{ article.Description|truncatewords:5 }}
{# 预期输出: AnQiCMS is an enterprise-grade content... #}

对于中文内容,由于中文不像英文那样有明确的空格分隔单词,truncatewords 会将连续的中文文字视为一个“单词”。例如,"你好世界"|truncatewords:1 的结果会是 "你好世界",因为它被视为一个完整的单词。因此,在处理中文时,通常建议使用 truncatechars 来实现更精确的截取效果。

针对HTML内容的截取:truncatechars_htmltruncatewords_html

在很多情况下,我们的文章内容、产品详情描述等会包含丰富的HTML标签,如段落、加粗、图片等。直接使用 truncatecharstruncatewords 可能会导致HTML标签被截断,从而破坏页面布局,甚至引起显示错误。AnQiCMS 提供了带有 _html 后缀的过滤器来解决这个问题,它们在截取内容的同时,会智能地闭合所有未闭合的HTML标签,确保页面结构的完整性。

按字符数截取HTML内容:truncatechars_html

这个过滤器会按字符数量进行截取,并在截取点之前闭合所有打开的HTML标签。为了让浏览器正确解析截取后的HTML内容,通常需要搭配 |safe 过滤器使用,告诉模板引擎这段内容是安全的,不需要进行额外的HTML实体转义。

{# 假设 `article.Content` 包含 HTML 内容,例如:
   `<p><b>AnQiCMS</b>是一个基于<i>Go语言</i>开发的企业级内容管理系统,致力于提供高效、可定制、易扩展的内容管理解决方案。</p><p>项目定位于服务中小企业、自媒体运营者和多站点管理需求的用户。</p>` #}

{# 截取前40个字符的HTML内容,并保持HTML结构 #}
{{ article.Content|truncatechars_html:40|safe }}
{# 预期输出可能类似 (具体截取点及省略号前内容会根据实际HTML结构调整,并确保闭合):
   <p><b>AnQiCMS</b>是一个基于<i>Go语言</i>开发的企业级内容管理系统,致力于提供高效、可定制、易扩展... </p>
#}

按单词数截取HTML内容:truncatewords_html

truncatechars_html 类似,truncatewords_html 则是按单词数量截取HTML内容,并同样会智能闭合HTML标签。同样,为了确保HTML内容正确显示,需要配合 |safe 过滤器使用。

{# 假设 `article.Content` 内容同上 #}

{# 截取前15个单词的HTML内容,并保持HTML结构 #}
{{ article.Content|truncatewords_html:15|safe }}
{# 预期输出可能类似:
   <p><b>AnQiCMS</b>是一个基于<i>Go语言</i>开发的企业级内容管理系统,致力于提供高效、可定制、易扩展的内容管理... </p>
#}

重要提示: 在使用 truncatechars_htmltruncatewords_html 过滤器时,务必在管道操作的末尾加上 |safe。这是因为 AnQiCMS 的模板引擎默认会对所有输出进行HTML实体转义,以防止XSS攻击。而这些 _html 过滤器产生的正是需要浏览器直接解析的HTML代码,如果缺少 |safe,截取后的HTML标签会被当作普通文本显示,而不是被浏览器渲染。

实际应用场景

这些过滤器在 AnQiCMS 的模板设计中非常实用:

  • 文章列表页:在 archiveList 标签循环输出文章时,可以使用 item.Description|truncatechars:100item.Content|truncatewords_html:50|safe 来显示文章摘要,保持列表页的整洁。
  • 产品展示页:在产品概览部分,可以用 product.Detail|truncatechars_html:150|safe 来预览产品的详细描述。
  • 侧边栏或推荐模块:需要展示标题较长的热门文章或推荐内容时,article.Title|truncatechars:25 可以确保标题不会溢出。

通过灵活运用这些内置过滤器,AnQiCMS 用户能够更加精细地控制内容的呈现方式,显著提升网站的用户体验和视觉效果。


常见问题解答 (FAQ)

1. truncatecharstruncatewords 这两个过滤器有什么区别,我应该如何选择?

truncatechars 按字符数量截取,即使截取点在单词中间也会直接截断,包括省略号在内的字符总数不会超过你设定的值。而 truncatewords 则按单词数量截取,它会尽量保持单词的完整性,在最后一个完整单词后截取。

  • 如果你的内容是纯文本,并且需要精确控制最终显示文本的长度(例如,固定高度的卡片),选择 truncatechars 更合适。
  • 如果你的内容是纯文本,且你希望截取后的文本语义更完整(不希望单词被切开),则 truncatewords 是更好的选择。
  • 在处理中文内容时,由于中文没有天然的空格分隔,truncatewords 会将连续的中文视为一个“单词”,这可能导致截取不准确,此时更推荐使用 truncatechars

2. 为什么在截取HTML内容时,我必须使用 truncatechars_htmltruncatewords_html,而不是普通的 truncatechars 呢?

这是因为普通的 truncatecharstruncatewords 过滤器会把HTML标签也当做普通文本来计算长度或单词,并直接截断。这会导致HTML标签闭合不完整,从而破坏页面的结构和样式,造成排版混乱,甚至显示错误。 带有 _html 后缀的过滤器(如 truncatechars_html)则会智能地识别HTML标签,在截取文本内容的同时,确保所有打开的HTML标签(如 <b><p><i> 等)在截取点前被正确闭合,从而避免页面结构被破坏,保证内容的正确渲染。

3. 截取后显示的省略号可以自定义为其他符号或文字吗?

目前 AnQiCMS 内置的 truncatecharstruncatewordstruncatechars_htmltruncatewords_html 过滤器,默认生成的省略号是三个点(“…”),并且不支持直接通过参数自定义省略号的符号或文字。如果需要自定义,你可能需要考虑在内容截取后,手动移除默认的省略号,并添加你想要的自定义文本。但这会增加模板的复杂性,且可能需要结合字符串替换等操作。在大多数情况下,使用默认的省略号已经足够满足内容展示的需求。

相关文章

如何在模板中安全地输出包含HTML标签的内容,避免被浏览器转义?

在网站运营中,我们经常需要展示包含丰富排版和媒体内容的信息,例如精心编辑的文章详情、产品介绍或自定义页面。这些内容往往包含 HTML 标签,如图片标签 `<img>`、链接标签 `<a>`、段落标签 `<p>` 等。然而,如果你直接将这些内容输出到网页上,可能会发现它们并没有按照预期渲染,而是以文本形式原样显示了 HTML 标签,大大影响了用户体验和页面的美观度。 这并非 AnQiCMS

2025-11-08

如何在产品列表或文章列表页实现多条件筛选,并显示过滤后的结果?

在内容管理系统中,为用户提供灵活的多条件筛选功能,是提升网站可用性和用户体验的关键一环。无论是电商网站的产品列表,还是内容门户的文章分类页面,用户都希望能快速定位到自己感兴趣的内容。安企CMS(AnQiCMS)凭借其强大的内容模型和模板标签系统,让您能够轻松实现这一需求,并直观地显示过滤后的结果。 ### 1. 奠定基础:定义内容模型与自定义字段 所有筛选功能都离不开数据。在安企CMS中

2025-11-08

如何在详情页显示内容模型中自定义的额外字段内容?

AnQiCMS 的核心优势之一就是其灵活的内容模型功能。它允许我们根据不同业务场景,比如产品、服务、活动等,为内容添加各种独有的自定义字段。这些自定义字段极大地丰富了内容的表达形式,让我们的网站内容更加专业和贴合需求。但有了这些额外字段后,如何让它们在前台详情页中优雅地呈现出来呢?今天

2025-11-08

安企CMS如何实现文章或产品内容的关键词自动替换显示?

在内容运营中,我们经常需要确保文章或产品描述中的特定关键词保持一致,甚至自动关联到相关页面,这对于SEO优化和提升用户体验至关重要。但手动逐一修改不仅耗时,还容易出错,尤其当网站内容量庞大时,更是一个巨大的挑战。安企CMS深知这一点,因此为我们提供了一项非常实用的功能,那就是文章或产品内容的关键词自动替换显示。 这项功能能够智能地识别出你预设的关键词或词组,并将其自动替换为指定的文本、链接

2025-11-08

如何将用户输入的纯文本内容(包含换行符)格式化为HTML段落和换行符显示?

在网站内容管理中,我们经常会遇到这样的需求:用户在后台输入了一段纯文本内容,其中包含了一些自然的分段和换行,我们希望这些分段和换行在网站前端能够被正确地渲染为HTML的段落(`<p>`标签)和换行(`<br/>`标签),而不是简单地挤成一团或者被浏览器忽略。安企CMS提供了非常便捷且强大的模板过滤器来解决这个问题,让纯文本内容也能优雅地呈现在网页上。 ###

2025-11-08

如何将后台存储的时间戳数据转换为可读的日期和时间格式显示?

在安企CMS中管理网站内容时,我们经常会遇到需要展示日期和时间的情况。然而,后台数据库里存储的这些时间信息,通常以时间戳(timestamp)的形式存在,这对于机器处理来说非常高效,但对用户而言却难以直接阅读。例如,你可能会看到一串像 `1609470335` 这样的数字,它代表的是某个特定时刻,但我们希望它能显示为“2021年1月1日 12:25:35”这种更友好的格式。 幸运的是

2025-11-08

如何将数组中的元素按照指定的分隔符连接成字符串进行显示?

在安企CMS中管理和展示内容时,我们经常会遇到需要将一组相关信息合并成一段连贯文字的情况。比如说,一个产品可能有多种特性,我们希望将这些特性列表用逗号或斜杠连接起来统一显示;又或者,一篇文章关联了多个关键词标签,我们想把这些标签汇总成一行文字。此时,安企CMS强大的模板过滤器就能派上用场,特别是 `join` 过滤器,它能帮助我们轻松实现这一目标。 ### 理解 `join` 过滤器

2025-11-08

如何在模板中对数字进行基本的算术运算,并将结果显示出来?

在网站运营中,我们经常需要动态地展示一些数字信息,比如产品总价、文章阅读量百分比、折扣后的价格等等。安企CMS 提供的模板系统功能强大,它采用了类似 Django 模板引擎的语法,让我们可以在内容展示时轻松实现这些需求,直接在模板中对数字进行基本的算术运算,并将结果显示出来。 ### 掌握模板中的基本算术运算 在安企CMS的模板中,最直接的方式就是在双花括号 `{{ }}` 中编写算术表达式

2025-11-08