在AnQiCMS的模板开发中,我们常常会遇到需要处理字符串或数组内容,例如展示文章摘要、限制图片列表数量,或者从一个长文本中提取特定信息。安企CMS基于Go语言开发,其模板引擎支持类似Django和Blade的语法,提供了丰富的过滤器(filters)来帮助我们高效地完成这些内容截取和显示的需求。
我们一起来看看,如何在AnQiCMS模板中灵活地截取字符串或数组的指定部分进行显示。
核心方法:slice 过滤器实现精准截取
当我们需要对字符串或数组(在Go语言中通常是切片)进行精确的片段截取时,slice 过滤器是我们的首选工具。它允许我们指定一个起始和结束位置来获取内容的子集。
基本用法
slice 过滤器的语法非常直观:{{ obj|slice:"start:end" }}。
start参数是截取的起始索引(包含该位置)。end参数是截取的结束索引(不包含该位置)。- 索引值都是从 0 开始计数。
灵活的截取方式
slice 过滤器非常灵活,我们可以根据需要省略 start 或 end:
{{ obj|slice:":end" }}:从开头截取到end之前。{{ obj|slice:"start:" }}:从start位置截取到末尾。{{ obj|slice:"start:end" }}:截取从start到end之间的部分。- 此外,它还支持负数索引,例如
{{ obj|slice:"-3:" }}表示从倒数第三个元素开始截取到末尾,这在某些场景下非常方便。
实际应用示例
假设我们正在开发一个新闻列表,需要显示文章标题的前几个字,或者产品详情页展示一组图片中的前三张。
截取字符串(如文章标题的部分内容): 如果
archive.Title是 “AnQiCMS模板开发与内容运营指南”,我们想只显示前10个字符:<p>标题前10字:{{ archive.Title|slice:":10" }}</p>输出可能为:”AnQiCMS模板开发与内容运”
截取数组(如图片列表中的前几张): 假设
archive.Images是一个包含多个图片URL的数组["img1.jpg", "img2.jpg", "img3.jpg", "img4.jpg"],我们只想显示前两张图片:{% set firstTwoImages = archive.Images|slice:":2" %} {% for img in firstTwoImages %} <img src="{{ img }}" alt="产品图片"> {% endfor %}这里,我们先用
set标签将截取结果赋值给firstTwoImages变量,然后循环输出。结合负数索引截取数组: 如果我们需要显示数组的最后两个元素:
{% set lastTwoImages = archive.Images|slice:"-2:" %} {% for img in lastTwoImages %} <img src="{{ img }}" alt="产品图片"> {% endfor %}
其他实用方法:截取与处理
除了 slice 过滤器提供精确截取外,AnQiCMS还提供了其他一些过滤器,可以帮助我们以不同的方式截取、处理和显示字符串或数组内容。
first和last过滤器:获取首个或末尾元素 当只需要获取字符串或数组的第一个或最后一个元素时,first和last过滤器非常方便。{{ obj|first }}:获取第一个字符或数组的第一个元素。{{ obj|last }}:获取最后一个字符或数组的最后一个元素。 例如,获取文章标签列表中的第一个标签:
{% tagList tags with itemId=archive.Id limit="1" %} {% if tags %} <p>第一个标签:{{ tags|first.Title }}</p> {% endif %} {% endtagList %}truncatechars和truncatewords过滤器:限制长度并添加省略号 这两个过滤器主要用于控制文本的显示长度,并在超出指定长度时添加省略号(...)。它们非常适合用于文章摘要或简介的显示。{{ obj|truncatechars:number }}:按字符数截取,包括省略号。可能会截断单词。{{ obj|truncatechars_html:number }}:安全地截取包含HTML标签的字符串,避免破坏HTML结构。{{ obj|truncatewords:number }}:按单词数截取,包括省略号,不会截断单词。{{ obj|truncatewords_html:number }}:安全地截取包含HTML标签的字符串,按单词数计算。 例如,显示文章简介的前50个字符,并确保HTML标签不被破坏:
<p>简介摘要:{{ archive.Description|truncatechars_html:50|safe }}</p>注意
|safe的使用,它表示此内容是安全的HTML,不需要进行转义。split和join过滤器:字符串与数组的相互转换 在处理一些以特定分隔符存储的字符串(如逗号分隔的关键词)时,split和join过滤器会非常有用。{{ obj|split:"分隔符" }}:将字符串按指定分隔符切割成数组。{{ arr|join:"分隔符" }}:将数组元素按指定分隔符连接成字符串。 假设archive.Keywords是一个逗号分隔的字符串 “AnQiCMS,GoLang,CMS系统”,我们想获取第一个关键词:
{% set keywordsArray = archive.Keywords|split:"," %} <p>第一个关键词:{{ keywordsArray|first }}</p>或者,你也可以先用
split转换成数组,再用slice获取部分,然后join回字符串:{% set topTwoKeywords = archive.Keywords|split:","|slice:":2"|join:" & " %} <p>主要关键词:{{ topTwoKeywords }}</p>输出可能为:”AnQiCMS & GoLang”
length过滤器:获取长度 虽然length过滤器本身不用于截取,但它在截取场景下经常用于判断内容长度,从而决定是否需要截取或显示特定内容。{{ obj|length }}:获取字符串、数组或键值对的长度。 例如,只有当文章标题长度超过20时才截取显示:
{% if archive.Title|length > 20 %} <p>短标题:{{ archive.Title|slice:":20" }}...</p> {% else %} <p>完整标题:{{ archive.Title }}</p> {% endif %}
如何选择合适的方法?
选择哪种方法取决于你的具体需求:
- 需要精确控制截取范围(从哪个索引到哪个索引):使用
slice过滤器。 - 只需要获取第一个或最后一个元素:使用
first