AnQiCMS模板中如何截取字符串或数组的指定部分进行显示?

在AnQiCMS的模板开发中,我们常常会遇到需要处理字符串或数组内容,例如展示文章摘要、限制图片列表数量,或者从一个长文本中提取特定信息。安企CMS基于Go语言开发,其模板引擎支持类似Django和Blade的语法,提供了丰富的过滤器(filters)来帮助我们高效地完成这些内容截取和显示的需求。

我们一起来看看,如何在AnQiCMS模板中灵活地截取字符串或数组的指定部分进行显示。

核心方法:slice 过滤器实现精准截取

当我们需要对字符串或数组(在Go语言中通常是切片)进行精确的片段截取时,slice 过滤器是我们的首选工具。它允许我们指定一个起始和结束位置来获取内容的子集。

基本用法

slice 过滤器的语法非常直观:{{ obj|slice:"start:end" }}

  • start 参数是截取的起始索引(包含该位置)。
  • end 参数是截取的结束索引(不包含该位置)。
  • 索引值都是从 0 开始计数。

灵活的截取方式

slice 过滤器非常灵活,我们可以根据需要省略 startend

  • {{ obj|slice:":end" }}:从开头截取到 end 之前。
  • {{ obj|slice:"start:" }}:从 start 位置截取到末尾。
  • {{ obj|slice:"start:end" }}:截取从 startend 之间的部分。
  • 此外,它还支持负数索引,例如 {{ obj|slice:"-3:" }} 表示从倒数第三个元素开始截取到末尾,这在某些场景下非常方便。

实际应用示例

假设我们正在开发一个新闻列表,需要显示文章标题的前几个字,或者产品详情页展示一组图片中的前三张。

  1. 截取字符串(如文章标题的部分内容): 如果 archive.Title 是 “AnQiCMS模板开发与内容运营指南”,我们想只显示前10个字符:

    <p>标题前10字:{{ archive.Title|slice:":10" }}</p>
    

    输出可能为:”AnQiCMS模板开发与内容运”

  2. 截取数组(如图片列表中的前几张): 假设 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 变量,然后循环输出。

  3. 结合负数索引截取数组: 如果我们需要显示数组的最后两个元素:

    {% set lastTwoImages = archive.Images|slice:"-2:" %}
    {% for img in lastTwoImages %}
        <img src="{{ img }}" alt="产品图片">
    {% endfor %}
    

其他实用方法:截取与处理

除了 slice 过滤器提供精确截取外,AnQiCMS还提供了其他一些过滤器,可以帮助我们以不同的方式截取、处理和显示字符串或数组内容。

  1. firstlast 过滤器:获取首个或末尾元素 当只需要获取字符串或数组的第一个或最后一个元素时,firstlast 过滤器非常方便。

    • {{ obj|first }}:获取第一个字符或数组的第一个元素。
    • {{ obj|last }}:获取最后一个字符或数组的最后一个元素。 例如,获取文章标签列表中的第一个标签:
    {% tagList tags with itemId=archive.Id limit="1" %}
        {% if tags %}
            <p>第一个标签:{{ tags|first.Title }}</p>
        {% endif %}
    {% endtagList %}
    
  2. truncatecharstruncatewords 过滤器:限制长度并添加省略号 这两个过滤器主要用于控制文本的显示长度,并在超出指定长度时添加省略号(...)。它们非常适合用于文章摘要或简介的显示。

    • {{ 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,不需要进行转义。

  3. splitjoin 过滤器:字符串与数组的相互转换 在处理一些以特定分隔符存储的字符串(如逗号分隔的关键词)时,splitjoin 过滤器会非常有用。

    • {{ 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”

  4. length 过滤器:获取长度 虽然 length 过滤器本身不用于截取,但它在截取场景下经常用于判断内容长度,从而决定是否需要截取或显示特定内容。

    • {{ obj|length }}:获取字符串、数组或键值对的长度。 例如,只有当文章标题长度超过20时才截取显示:
    {% if archive.Title|length > 20 %}
        <p>短标题:{{ archive.Title|slice:":20" }}...</p>
    {% else %}
        <p>完整标题:{{ archive.Title }}</p>
    {% endif %}
    

如何选择合适的方法?

选择哪种方法取决于你的具体需求:

  • 需要精确控制截取范围(从哪个索引到哪个索引):使用 slice 过滤器。
  • 只需要获取第一个或最后一个元素:使用 first