在内容运营的日常工作中,我们常常需要根据内容的特定信息进行判断和展示。例如,一篇博客文章如果提到了某个热门关键词,我们可能希望给它一个特殊的标记;或者一个产品描述中包含了某个特性,我们想据此调整其展示样式。安企CMS(AnQiCMS)的模板引擎提供了灵活且直观的方式来判断字符串或数组中是否包含特定的内容,这让内容的动态展示和个性化处理变得非常便捷。

要实现这样的判断,安企CMS主要提供了两种强大的机制:contain 过滤器和 in 运算符,它们各自适用于不同的场景。

核心利器:contain 过滤器

contain 过滤器是安企CMS模板中专门用于检查内容是否包含特定关键词的工具。它的强大之处在于不仅可以用于字符串,还能有效地检查数组、映射(map)甚至结构体(struct)中是否存在指定内容。当它找到匹配项时,会返回一个布尔值(TrueFalse),这使得它非常适合与条件判断结合使用。

contain 过滤器的基本用法是 {{对象 | contain: "关键词"}}

1. 判断字符串是否包含关键词:

这是最常见的应用场景。假如你有一段文字内容,想知道其中是否提到了“安企CMS”:

{% set article_content = "欢迎使用安企CMS(AnQiCMS)来搭建您的网站。" %}
{% if article_content | contain: "安企CMS" %}
    <p>文章中提到了安企CMS!</p>
{% else %}
    <p>文章中没有提及安企CMS。</p>
{% endif %}

如果 article_content 变量的值是“欢迎使用安企CMS(AnQiCMS)来搭建您的网站。”,那么上述代码会输出“文章中提到了安企CMS!”。

2. 判断数组中是否存在某个元素:

如果你的变量是一个数组(在Go语言模板中通常是 slice),contain 过滤器可以检查数组中是否存在与“关键词”完全匹配的元素。

{% set keywords_list = ["安企CMS", "网站建设", "内容管理"] %}
{% if keywords_list | contain: "网站建设" %}
    <p>关键词列表中包含“网站建设”。</p>
{% else %}
    <p>关键词列表中不包含“网站建设”。</p>
{% endif %}

这里,“网站建设”是数组中的一个元素,所以会输出“关键词列表中包含‘网站建设’。”。值得注意的是,contain 过滤器在检查数组时,进行的是元素的完全匹配

3. 判断映射(Map)或结构体(Struct)中是否存在某个键(Key):

contain 过滤器也能用于检查映射或结构体中是否存在特定的键名(字段名)。这对于检查数据结构中某个属性是否存在非常有用。

{% set product_info = {"name": "安企CMS", "version": "3.0", "price": 0} %}
{% if product_info | contain: "price" %}
    <p>产品信息中包含价格字段。</p>
{% else %}
    <p>产品信息中不包含价格字段。</p>
{% endif %}

上述代码会输出“产品信息中包含价格字段。”,因为它检查的是 price 这个键名是否存在。

更通用的判断方式:in 运算符

除了 contain 过滤器,安企CMS的模板引擎还支持 in 运算符,它通常直接用于 if 语句中,判断一个值是否在另一个集合(如字符串或数组)中。in 运算符提供了更为简洁的语法,尤其适用于直接的条件判断。

1. 判断字符串是否包含子字符串:

contain 过滤器类似,in 运算符可以直接检查一个字符串是否包含另一个子字符串。

{% set page_title = "关于安企CMS的优势" %}
{% if "CMS" in page_title %}
    <p>页面标题中包含“CMS”。</p>
{% else %}
    <p>页面标题中不包含“CMS”。</p>
{% endif %}

2. 判断元素是否在数组中:

in 运算符也可以判断一个元素是否存在于数组中。

{% set tag_names = ["建站", "营销", "优化"] %}
{% if "优化" in tag_names %}
    <p>这个标签在列表中。</p>
{% else %}
    <p>这个标签不在列表中。</p>
{% endif %}

in 运算符与 contain 过滤器的选择:

  • 如果你只是想在 if 语句中进行一个简单的“是否包含”的判断,in 运算符通常更为简洁直观。
  • 如果你需要将判断结果存储到一个变量中,或者与其他过滤器链式调用,那么 contain 过滤器将是更好的选择,因为它返回一个布尔值。

不止包含:深入挖掘内容

在某些情况下,你可能不仅仅想知道“是否包含”,还需要更详细的信息,例如关键词出现的位置或次数。安企CMS同样提供了相应的过滤器来满足这些需求。

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

如果你不仅想知道是否包含,还想知道关键词首次出现的位置,可以使用 index 过滤器。它会返回关键词首次出现的索引位置(从0开始),如果未找到则返回 -1。这可以作为判断包含的另一种方式(即 index >= 0)。

{% set document_text = "安企CMS是一个高效的内容管理系统,CMS功能强大。" %}
{% set first_cms_pos = document_text | index: "CMS" %}
{% if first_cms_pos >= 0 %}
    <p>“CMS”首次出现在位置:{{ first_cms_pos }}</p>
{% else %}
    <p>未找到“CMS”。</p>
{% endif %}

需要注意的是,对于包含中文的字符串,index 过滤器在计算位置时,一个中文字符通常被算作多个字节长度(在UTF-8编码下,一个中文字符通常占3个字节)。

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

如果想知道某个关键词在字符串或数组中出现了多少次,可以使用 count 过滤器。

{% set long_text = "安企CMS提供卓越的用户体验,安企CMS致力于服务中小企业。" %}
{% set cms_count = long_text | count: "安企CMS" %}
<p>“安企CMS”在文本中出现了 {{ cms_count }} 次。</p>

同样地,对于数组,count 过滤器会统计完全匹配的元素出现次数。

实际应用场景:让内容更智能

  • 条件显示特定区块: 如果文章内容包含“视频”字样,就显示一个视频播放器区域。
  • 高亮显示关键词: 虽然直接高亮需要更复杂的字符串替换逻辑,但通过判断关键词是否存在,可以为包含特定关键词的页面或列表项添加特殊样式。
  • 根据内容调整SEO信息: 虽然TDK标签通常在后台设置,但在某些高级模板场景下,可以根据页面的动态内容判断是否需要调整辅助性的Meta标签。
  • 表单验证信息: 在某些自定义表单中,可以检查用户输入是否包含敏感词或其他特定模式。

总而言之,安企CMS在判断字符串或数组是否包含特定内容方面,提供了多样且易用的模板功能。无论是简单的布尔判断,还是需要更精细的位置或次数统计,都能在模板层面灵活实现,帮助内容运营者更高效地控制和展示网站内容。


常见问题 (FAQ)

Q1: in 运算符和 contain 过滤器在用法上有什么核心区别?

A1: in 运算符是安企CMS模板中直接用于 if 语句的逻辑判断操作符,例如 {% if "关键词" in 变量 %},它不能被链式调用,也无法将判断结果赋值给新的变量。而 contain 过滤器则是一个函数式的操作,它返回一个布尔值,可以与其他过滤器链式调用,也可以通过 {% set is_contained = 变量 | contain: "关键词" %} 这样的方式将结果赋值给一个新变量,以便在后续的模板逻辑中使用。简单来说,in 更适合直接的条件判断,contain 更适合需要获取布尔结果并进行进一步处理的场景。

Q2: contain 过滤器能否判断数组中某个元素的 部分 内容?例如,判断 ["Apple", "Banana"] 中是否有元素包含 “an”?