在安企CMS的日常运营中,我们经常会遇到需要处理一些存储为字符串但实际包含多个值的数据。例如,文章可能用逗号分隔的方式存储了多个关键词,或者您自定义的某个内容字段需要支持多项选择,而这些选择项最终以特定符号连接成了一个字符串。在这种情况下,我们常常需要将这些字符串按照预设的分隔符“切割”成独立的片段,以便在页面上进行灵活展示或进一步处理。

安企CMS基于Go语言的高效架构,并采用了类似Django模板引擎的语法,这为我们提供了强大的内容渲染能力。在这个模板系统中,有一个非常实用的功能,那就是“过滤器”(Filters)。通过巧妙地运用这些过滤器,我们可以轻松实现将字符串切割成数组的需求。

认识 split 过滤器:字符串切割的核心工具

在安企CMS的模板系统中,split 过滤器正是解决字符串切割成数组这一问题的利器。它的作用非常直观:根据您指定的分隔符,将一个字符串拆分成一个包含多个元素的数组(或者在编程术语中,叫做切片)。

基本使用方法:

split 过滤器的使用方式非常简洁,您只需要将要处理的字符串通过管道符 | 传递给 split 过滤器,并用冒号 : 指定您的分隔符即可。

{{ 您的字符串变量 | split:"分隔符" }}

举个例子,假设我们有一个文章的标签字段 archive.Tags,其值为 "SEO,内容营销,网站优化,用户体验"。如果我们想把这些标签逐一列出来,就可以这样操作:

{% set tagsString = "SEO,内容营销,网站优化,用户体验" %}
{% set tagsArray = tagsString | split:"," %}

<div class="article-tags">
    {% for tag in tagsArray %}
        <span class="tag-item">{{ tag }}</span>
    {% endfor %}
</div>

在这段代码中,我们首先通过 set 标签定义了一个 tagsString 变量来模拟数据,然后使用 split:"," 将这个字符串按照逗号 , 分割成了一个名为 tagsArray 的数组。接着,我们就可以利用 for 循环遍历这个 tagsArray,将每一个标签独立展示出来。

分隔符的灵活性:

split 过滤器在处理分隔符时非常灵活。

  • 多个字符作为分隔符: 如果您的分隔符是多个字符组成的,例如 " || ",您也可以直接指定。
    
    {% set keywordsString = "GoLang || AnQiCMS || 模板开发" %}
    {% set keywordsArray = keywordsString | split:" || " %}
    {# 结果:["GoLang", "AnQiCMS", "模板开发"] #}
    
  • 分隔符不存在: 如果指定的分隔符在字符串中找不到split 过滤器不会报错,而是会返回一个只包含原始字符串本身的单元素数组。
    
    {% set text = "安企CMS是一个优秀的系统" %}
    {% set result = text | split:"," %}
    {# 结果:["安企CMS是一个优秀的系统"] #}
    
  • 空分隔符: 如果您将分隔符设置为空字符串 ""split 过滤器会把字符串中的每一个UTF-8字符都当作一个独立的元素进行切割,即使是中文汉字也会被单独拆分。
    
    {% set chineseText = "你好世界" %}
    {% set charsArray = chineseText | split:"" %}
    {# 结果:["你", "好", "世", "界"] #}
    

另一种切割方式:make_list 过滤器

除了 split 之外,安企CMS还提供了 make_list 过滤器。这个过滤器与 split 的功能略有不同,它不需要指定分隔符,而是直接将字符串中的每一个字符(无论是英文、数字还是中文)都拆分成数组中的一个独立元素。

使用方法:

{{ 您的字符串变量 | make_list }}

当您需要逐个处理字符串中的每一个字符时,make_list 过滤器会非常方便。

{% set slogan = "AnQiCMS" %}
{% set charList = slogan | make_list %}

<p>口号分解:
    {% for char in charList %}
        <span>{{ char }}</span>
    {% endfor %}
</p>
{# 结果:口号分解:A n Q i C M S #}

切割成数组后,您可以做什么?

一旦您通过 splitmake_list 将字符串成功转换成了数组,安企CMS的模板系统就为您提供了丰富的后续处理能力:

  1. 遍历数组: 最常见的操作就是使用 for 循环遍历数组,将每个元素独立展示。

    {% for item in mySplittedArray %}
        <li>{{ item }}</li>
    {% endfor %}
    

    您还可以在循环中获取当前元素的索引或剩余元素的数量,例如 forloop.Counterforloop.Revcounter

  2. 获取数组长度: 使用 length 过滤器可以轻松获取数组中元素的数量。

    {% set count = mySplittedArray | length %}
    <p>共有 {{ count }} 个项目。</p>
    
  3. 获取第一个或最后一个元素: 如果您只需要数组的第一个或最后一个元素,可以使用 firstlast 过滤器。

    <p>第一个元素:{{ mySplittedArray | first }}</p>
    <p>最后一个元素:{{ mySplittedArray | last }}</p>
    
  4. 重新组合数组为字符串: 有时候,您可能需要将处理过的数组元素重新组合成一个字符串。这时,join 过滤器就派上用场了,它是 split 的逆操作。

    {% set newString = myProcessedArray | join:" - " %}
    <p>重新组合后的字符串:{{ newString }}</p>
    

实际应用场景示例

设想您的安企CMS后台某个自定义字段 ProductFeatures,用户输入了产品的多个特点,用分号 ; 分隔:"防水;防尘;快充;超长待机"。在前端页面,您希望将这些特点显示为一个个带有小图标的列表项。

{# 假设 product.ProductFeatures 变量值为 "防水;防尘;快充;超长待机" #}
{% set featuresString = product.ProductFeatures %}
{% set featuresArray = featuresString | split:";" %}

{% if featuresArray %}
<ul class="product-features-list">
    {% for feature in featuresArray %}
        <li>
            <i class="icon-check"></i>
            <span>{{ feature }}</span>
        </li>
    {% endfor %}
</ul>
{% endif %}

通过这种方式,即使后台的用户只输入了一个简单的字符串,前端也能以结构化、美观的形式呈现,大大提升了内容展示的灵活性和用户体验。

安企CMS的模板过滤器提供了强大而直观的字符串处理能力,split 过滤器便是其中非常重要的一员。掌握了这些技巧,您就能更高效地管理和展示网站内容,让您的安企CMS网站更加生动和动态。


常见问题 (FAQ)

1. split 过滤器和 make_list 过滤器有什么主要区别?

split 过滤器需要您指定一个分隔符,它会根据这个分隔符将字符串切割成多个片段。例如,"a,b,c" | split:"," 会得到 ["a", "b", "c"]。而 make_list 过滤器不需要分隔符,它会直接将字符串中的每一个字符都拆分成数组中的一个独立元素。例如,"abc" | make_list 会得到 ["a", "b", "c"]。选择哪个过滤器取决于您希望按什么粒度来拆分字符串。

2. 如果我使用的分隔符在字符串中不存在,split 过滤器会返回什么结果?

当您指定的分隔符在原始字符串中找不到时,split 过滤器并不会报错,而是会返回一个只包含原始字符串本身的单元素数组。例如,"Hello World" | split:"," 会返回 ["Hello World"]。这意味着您的模板代码在处理这类情况时无需额外的错误判断,可以直接遍历这个包含一个元素的数组。

3. 如何获取切割后数组的第一个或最后一个元素,而不是遍历整个数组?

在安企CMS的模板中,如果 myArray 是一个已经通过 splitmake_list 得到的数组,您可以直接使用 firstlast 过滤器来获取特定元素。例如,{{ myArray | first }} 将返回数组的第一个元素,而 {{ myArray | last }} 则返回最后一个元素。这比使用 for 循环遍历并判断 forloop.Counter 来获取更简洁。