在网站内容运营中,我们有时需要对文章标题进行更精细化的处理,例如突出显示某个关键词,或者根据关键词的位置进行内容组织。对于 AnQiCMS 而言,系统提供了强大的模板引擎,结合其内置的过滤器,我们可以轻松实现这些需求。今天,我们就来探讨如何在 AnQiCMS 的文章标题中,准确获取某个关键词首次出现的位置。

核心功能揭秘:index 过滤器

要在 AnQiCMS 的模板中找到字符串内特定关键词的位置,我们需要用到一个非常实用的内置功能——index 过滤器。这个过滤器专门用于查找子字符串在主字符串中的首次出现位置。

它的基本用法非常直观:

{{ 主字符串 | index: "要查找的关键词" }}

当你将一个字符串通过管道符 | 传递给 index 过滤器,并提供一个关键词作为参数时,它会返回该关键词在主字符串中首次出现的起始位置。这个位置是从 0 开始计数的,也就是说,如果关键词在字符串的开头,它将返回 0。如果关键词在字符串中没有找到,index 过滤器则会返回 -1

这里有一个特别需要注意的地方,尤其是在处理包含中文字符的标题时:index 过滤器在计算位置时,会将一个中文字符视为占据 3 个字节的位置。这意味着,如果你的标题中包含中文,并尝试查找一个英文关键词,其返回的位置可能会比你直观上认为的字符位置要大。例如,在字符串 "你好世界AnQiCMS" 中查找 "AnQiCMS"index 返回的位置将是 12(因为 “你好世界” 四个中文字符占据了 4 * 3 = 12 个位置)。

实战演练:在文章标题中查找关键词

现在,我们把 index 过滤器应用到 AnQiCMS 的文章标题上。通常,我们会在文章详情页获取当前文章的标题,或者在文章列表页遍历时获取每篇文章的标题。

首先,假设我们正在一个文章详情页,需要获取当前文章的标题,并查找其中的关键词:

{# 假设这是在文章详情页,archive 是当前文章对象 #}
{% set articleTitle = archive.Title %}
{% set searchKeyword = "AnQiCMS" %} {# 我们要查找的关键词 #}

{% set keywordPosition = articleTitle|index:searchKeyword %}

{% if keywordPosition != -1 %}
    <p>关键词 "{{ searchKeyword }}" 在标题 "{{ articleTitle }}" 中的首次出现位置是:{{ keywordPosition }} (从0开始计数)</p>
    {# 我们可以进一步利用这个位置信息 #}
    {% set keywordLength = searchKeyword|length %} {# 获取关键词的字节长度,用于后续截取 #}
    {% set textBefore = articleTitle|slice:":keywordPosition" %} {# 截取关键词前面的部分 #}
    {% set textAfter = articleTitle|slice:"(keywordPosition + keywordLength):" %} {# 截取关键词后面的部分 #}

    <p>标题中关键词前面的内容:<span>{{ textBefore }}</span></p>
    <p>标题中关键词后面的内容:<span>{{ textAfter }}</span></p>

    {# 甚至可以在模板中将关键词高亮显示,但这需要更复杂的字符串操作或在后端处理 #}
    {# 简单示例:替换关键词 #}
    {% set highlightedTitle = articleTitle|replace:"(searchKeyword, <mark>" ~ searchKeyword ~ "</mark>)" %}
    <p>高亮后的标题(简单替换):{{ highlightedTitle|safe }}</p>

{% else %}
    <p>在标题 "{{ articleTitle }}" 中未找到关键词 "{{ searchKeyword }}"。</p>
{% endif %}

这段代码首先通过 {% set ... %} 标签定义了文章标题和我们想要查找的关键词。接着,它使用 index 过滤器获取关键词的位置。如果位置不为 -1,则说明关键词存在,并会显示其位置。

你可以将 searchKeyword 设置为一个变量,以便从 URL 参数或其他配置中动态获取关键词,使搜索更加灵活。

更进一步:结合其他过滤器实现高级操作

index 过滤器虽然强大,但结合其他 AnQiCMS 模板过滤器,可以实现更丰富的标题处理功能。

  1. 判断关键词是否存在:contain 过滤器 如果你只需要知道标题中是否包含某个关键词,而不需要知道具体位置,contain 过滤器会更简洁。它直接返回 truefalse

    {% if articleTitle|contain:"重要" %}
        <p>标题中包含“重要”这个词。</p>
    {% endif %}
    
  2. 实现大小写不敏感的查找:lowerupper 过滤器 index 过滤器是大小写敏感的。如果你想进行不区分大小写的查找,可以将标题和关键词都转换为小写(或大写)再进行比较。

    {% set lowerTitle = articleTitle|lower %}
    {% set lowerKeyword = searchKeyword|lower %}
    {% set caseInsensitivePosition = lowerTitle|index:lowerKeyword %}
    
    
    {% if caseInsensitivePosition != -1 %}
        <p>不区分大小写查找,关键词 "{{ searchKeyword }}" 在标题中存在。</p>
    {% endif %}
    
  3. 提取关键词前后的内容:slice 过滤器 正如前面示例所示,一旦我们获得了关键词的起始位置 (keywordPosition) 和关键词的长度 (searchKeyword|length),就可以使用 slice 过滤器来提取标题中关键词前后的内容,这在展示摘要或突出显示上下文时非常有用。

    {# 结合上面的例子 #}
    {% set textBefore = articleTitle|slice:":keywordPosition" %}
    {% set textAfter = articleTitle|slice:"(keywordPosition + keywordLength):" %}
    

通过这些灵活的过滤器组合,你可以在 AnQiCMS 模板中对文章标题进行各种自定义的关键词分析和展示。

总结

AnQiCMS 的模板引擎提供了 index 过滤器,让我们能够精确地找到文章标题中特定关键词的首次出现位置。虽然在处理中文字符时需要留意其字节计数特性,但通过灵活运用 index 结合 setcontainlowerslice 等其他过滤器,我们可以实现对标题关键词的查找、判断、提取甚至简单的内容重组,从而为网站内容的动态展示和用户体验带来更多可能性。