在安企CMS的模板开发和日常内容运营中,我们经常会遇到需要根据内容的特定属性或关键词来动态展示信息的需求。无论是为了实现个性化的内容推荐、强调文章的特定主题,还是根据数据中的某些标志来控制页面元素的显示,准确判断一个字符串或数组是否包含特定关键词都是一项非常实用的技能。

安企CMS的模板系统采用了类似Django模板引擎的语法,内置了丰富的过滤器和标签,可以帮助我们轻松实现这类判断。接下来,我们将深入探讨如何在安企CMS模板中判断字符串或数组是否包含特定关键词,并提供一些实用的方法和场景示例。


使用 contain 过滤器进行关键词判断

在安企CMS的模板中,最直接、最常用的方法就是利用内置的 contain 过滤器。这个过滤器专门用于检测一个字符串或数组(切片)中是否包含指定的关键词。它的返回值是一个布尔类型(TrueFalse),非常适合与条件判断标签 {% if %} 结合使用。

基本用法:

{{ obj|contain:关键词 }}

其中,obj 可以是一个字符串变量,也可以是一个数组变量,而 关键词 则是你想要查找的特定字符串。

示例一:判断字符串是否包含关键词

假设我们通过 archiveDetail 标签获取了一篇文章的标题 archive.Title,并希望判断它是否包含“教程”这个词:

{% set articleTitle = archive.Title %} {# 假设 archive.Title 的值为 "安企CMS模板制作教程" #}

{% if articleTitle|contain:"教程" %}
    <p>这篇文章标题中包含了“教程”字样,这可能是一个入门指导!</p>
{% else %}
    <p>这篇文章标题中未包含“教程”字样。</p>
{% endif %}

在上面的例子中,如果 articleTitle 的内容是“安企CMS模板制作教程”,那么条件 articleTitle|contain:"教程" 将返回 True,并显示相应的提示信息。

示例二:判断数组中是否包含特定元素

有时候,数据会以数组的形式存在,比如一篇文章的Tag标签列表。我们可以通过 tagList 标签获取Tag列表,然后判断某个特定的Tag是否存在:

{% tagList tags with itemId=archive.Id %} {# 假设 tags 数组包含 ["网站优化", "SEO", "内容营销"] #}

{% if tags|contain:"SEO" %}
    <span class="highlight-tag">本文专注于SEO优化</span>
{% else %}
    <span>本文未涉及SEO优化</span>
{% endif %}

{% endtagList %}

在这个场景中,tags 变量是一个包含多个字符串的数组。tags|contain:"SEO" 会检查数组中是否存在值为“SEO”的元素。

示例三:判断键值对(Map/Struct)中是否存在特定键名

contain 过滤器也可以用来判断键值对(或结构体)中是否存在某个特定的键(key)。这在处理后台自定义字段,或一些配置型数据时非常有用。

{% set extraParams = archive.Extra %} {# 假设 extraParams 是一个包含自定义字段的Map,如 { "author": "张三", "source": "官网" } #}

{% if extraParams|contain:"author" %}
    <p>作者:{{ extraParams.author }}</p>
{% else %}
    <p>未指定作者信息。</p>
{% endif %}

在这里,extraParams|contain:"author" 会检查 extraParams 中是否存在名为 author 的键。


其他判断关键词的方法:indexcount 过滤器

除了 contain 过滤器之外,indexcount 过滤器也能间接帮助我们判断字符串或数组中是否包含特定关键词,并提供更详细的信息。

1. index 过滤器:获取关键词出现的位置

index 过滤器会返回关键词在字符串或数组中首次出现的位置(索引),如果未找到则返回 -1。我们可以利用这个特性来判断关键词是否存在。

基本用法:

{{ obj|index:关键词 }}

示例:结合 index 判断

{% set articleContent = archive.Content %} {# 假设内容中包含 "安企CMS是一款高效的CMS系统" #}

{% if articleContent|index:"高效" > -1 %}
    <p>内容中提到了“高效”,首次出现在第 {{ articleContent|index:"高效" }} 个字符处。</p>
{% else %}
    <p>内容中未提及“高效”。</p>
{% endif %}

如果 index 返回的值大于 -1,就意味着关键词存在。这种方法适用于你不仅关心关键词是否存在,还对它首次出现的位置感兴趣的场景。

2. count 过滤器:计算关键词出现的次数

count 过滤器可以统计某个关键词在字符串或数组中出现的次数。如果次数大于 0,则表明关键词存在。

基本用法:

{{ obj|count:关键词 }}

示例:结合 count 判断

{% set articleContent = archive.Content %} {# 假设内容中包含 "安企CMS是一款高效的CMS系统,安企CMS致力于提供高效解决方案。" #}
{% set cmsCount = articleContent|count:"CMS" %}

{% if cmsCount > 0 %}
    <p>内容中提到了“CMS”共 {{ cmsCount }} 次。</p>
{% else %}
    <p>内容中未提及“CMS”。</p>
{% endif %}

count 过滤器返回的数字大于 0 时,表示关键词存在。这种方法在需要了解关键词出现频率时非常有用。


实际应用场景:让内容更智能、更具表现力

这些关键词判断功能在实际的网站运营和模板设计中有着广泛的应用:

  • 动态展示推荐图标或角标: 例如,如果产品标题中包含“新品”或“特惠”,可以在产品图片上自动叠加一个“新品上市”或“限时优惠”的角标。
  • 个性化内容引导: 根据用户正在浏览的文章内容(例如,文章标题或关键词中包含“Go语言”),在侧边栏推荐更多关于Go语言的教程或相关产品。
  • 模板中的样式控制: 如果文章正文中包含某些特定短语(如“点击这里下载”),可以通过判断来对这些短语应用特殊的CSS样式,使其更醒目。
  • 列表内容的筛选和分组: 在后台自定义列表中,通过判断某个自定义字段是否包含特定值,来对前端展示的列表项进行条件筛选或分组。
  • 广告或营销信息的精准投放: 根据页面主题或内容关键词,动态插入相关的广告或促销信息,提高转化率。

需要注意的细节

在使用这些过滤器时,有几个细节值得我们注意:

  • 大小写敏感: 默认情况下,containindexcount 过滤器都是大小写敏感的。这意味着“CMS”和“cms”会被视为不同的关键词。如果需要进行大小写不敏感的判断,你需要先将源字符串和关键词都转换为相同的(例如,小写)再进行判断,例如 {% if articleTitle|lower|contain:"cms" %}
  • 数据来源: 确保你提供给过滤器的数据(字符串或数组)是正确的。通常,这些数据来源于安企CMS的各种标签,如 archiveDetail 返回的 archive.Titlearchive.Content,或者 archiveList 循环中的 item.Keywords 等。
  • 性能考量: 对于大多数网站和内容量,在模板中使用这些