在 AnQiCMS 的内容管理实践中,有时我们会遇到这样的需求:从包含丰富格式(如加粗、斜体、图片、链接等)的文档内容中,提取出纯粹的文本信息。这可能听起来有些矛盾,内容管理系统本就致力于内容的多元展示,为何还要“剥离”这些格式呢?然而,在许多特定场景下,只显示纯文本内容却能发挥关键作用,例如为文章生成简洁的摘要、优化搜索引擎的元描述(Meta Description)、在列表页提供统一且清爽的内容预览,或是将内容导入其他不支持HTML格式的平台。
那么,在 AnQiCMS 灵活的模板系统中,我们该如何高效地实现这一目标呢? AnQiCMS 提供了功能强大的过滤器,其中 striptags 和 removetags 就是解决这一问题的利器。
认识核心工具:striptags 过滤器
striptags 过滤器是 AnQiCMS 模板中一个非常实用的功能,它的作用正如其名——“剥离标签”。当您想从一段包含 HTML 标签的内容中,一次性移除所有 HTML 或 XML 标签,只保留其中文字时,striptags 就能派上用场。
它的使用方法非常直观,只需在您要处理的变量后面,通过管道符 | 连接 striptags 即可。例如,如果您有一个名为 archive.Content 的变量,其中存储了带有 HTML 格式的文章正文,您可以这样获取其纯文本内容:
{{ archive.Content | striptags }}
这段简单的代码会遍历 archive.Content 中的所有内容,识别并移除所有的 <div>、<p>、<a>、<img> 等 HTML 标签,最终只输出其中的可见文字。
处理 Markdown 内容的场景
值得注意的是,AnQiCMS 后台在编辑文档内容时,可能启用了 Markdown 编辑器。在这种情况下,archive.Content 变量中存储的可能是 Markdown 格式的文本,而非直接的 HTML。如果直接对 Markdown 文本使用 striptags,效果可能不尽如人意,因为它无法识别 Markdown 语法并将其转换为对应的纯文本。
此时,我们就需要先借助 render 过滤器,将 Markdown 文本渲染成 HTML,然后再使用 striptags 移除 HTML 标签。render 过滤器能够将 Markdown 语法正确地转换为浏览器可识别的 HTML 结构。因此,完整的处理流程会是这样:
{# 假设 archive.Content 变量中存储的是 Markdown 格式的内容 #}
{{ archive.Content | render | striptags }}
通过 render 过滤器,Markdown 内容被转换为 HTML,然后 striptags 再将这些 HTML 标签移除,确保最终输出的是纯文本。需要注意的是,render 过滤器输出的是HTML,如果直接显示到页面,为了避免浏览器转义HTML标签而导致HTML标签直接显示出来,需要在 render 过滤器后追加 safe 过滤器。但在与 striptags 结合使用时,由于 striptags 最终会去除所有 HTML,所以 safe 并非必需,因为它处理的最终结果就是纯文本。
灵活控制:removetags 过滤器
有时候,我们的需求可能更为精细:我们不希望移除所有 HTML 标签,而是只想移除特定的几种,而保留其他标签(比如,我们想保留 <a> 标签以便用户可以点击链接,但移除所有图片 <img> 或段落 <p> 标签)。这时,removetags 过滤器就显得尤为强大。
removetags 过滤器允许您指定一个或多个要移除的 HTML 标签。您只需在过滤器后面提供一个逗号分隔的标签名称列表即可。例如,如果您想移除 <i> 和 <span> 标签,但保留其他所有内容,您可以这样编写:
{# 移除 <i> 和 <span> 标签,保留其他所有标签 #}
{{ "<strong><i>Hello!</i><span>AnQiCMS</span></strong>" | removetags:"i,span" }}
这段代码会输出 <strong>Hello!AnQiCMS</strong>,可以看到 <i> 和 <span> 标签被移除了,而 <strong> 标签得以保留。这种精细的控制在内容展示的特定场景下提供了极大的灵活性。
结合截取功能生成纯文本摘要
在生成文章摘要或简介时,我们不仅需要纯文本,还需要控制其长度。AnQiCMS 提供了 truncatechars 和 truncatewords 过滤器,它们可以在截取字符串的同时,自动添加省略号 (...)。当与 striptags 结合使用时,可以轻松生成符合需求的纯文本摘要:
{# 获取纯文本内容,并截取前100个字符作为摘要 #}
<p>{{ archive.Content | render | striptags | truncatechars:100 }}</p>
{# 或者,按单词数量截取 #}
<p>{{ archive.Content | render | striptags | truncatewords:30 }}</p>
请注意,truncatechars 会按字符数截取(包括中文一个字符),而 truncatewords 会按单词数截取。根据您的具体需求和内容特性,选择合适的截取方式。
实践建议
在 AnQiCMS 模板中移除 HTML 标签,只显示纯文本内容,主要围绕 striptags 和 removetags 两个过滤器展开。在实际应用中,您需要:
- 确定内容来源:判断
archive.Content等变量中存储的内容是纯 HTML 还是 Markdown。如果是 Markdown,务必先使用render过滤器进行转换。 - 选择合适的过滤器:根据是需要完全移除所有标签(
striptags),还是只移除部分标签(removetags),来选择最合适的过滤器。 - 考虑摘要长度:如果用于生成摘要,结合
truncatechars或truncatewords确保输出内容的简洁性。 - SEO 优化:在
<meta name="description" content="...">标签中使用striptags确保纯文本输出,这对搜索引擎友好。
AnQiCMS 提供的这些过滤器让模板设计者能够灵活地控制内容的呈现方式,满足从完整富文本展示到简洁纯文本输出的各种需求,从而构建出更具表现力和功能性的网站。
常见问题 (FAQ)
1. striptags 和 removetags 过滤器有什么主要区别?
striptags 过滤器会移除内容中所有检测到的 HTML 和 XML 标签,不留任何余地,直接输出纯文本。而 removetags 过滤器则提供更精细的控制,它允许您指定一个或多个要移除的特定 HTML 标签(例如 <img>、<p>),而其他未指定的 HTML 标签则会保留在内容中。选择哪个过滤器取决于您是想完全移除所有格式,还是有选择性地保留某些格式。
2. 在生成文章摘要时,如何确保纯文本内容的长度合适?
在获取纯文本内容后,可以结合 truncatechars 或 truncatewords 过滤器来控制长度。首先使用 render (如果内容是 Markdown) 和 striptags 移除 HTML 标签,然后再应用截取过滤器。例如,{{ archive.Content | render | striptags | truncatechars:150 }} 会将内容转换为纯文本后,截取前 150 个字符并添加省略号。truncatewords 则是按单词数量进行截取。
3. 使用 striptags 过滤器输出纯文本内容会影响网站的搜索引擎优化(SEO)吗?
这取决于您在何处使用纯文本。在某些场景下,使用纯文本对 SEO 是有利的。例如,网站的 <meta name="description"> 标签应该只包含纯文本,因为搜索引擎通常只会抓取并展示纯文本的描述。在列表页显示文章摘要时,纯文本也有助于搜索引擎更快地理解内容。但请注意,不应将所有主要内容都转换为纯文本,因为搜索引擎也需要解析 HTML 结构来理解页面布局和内容重点。**实践是在需要简洁、无格式展示的区域使用纯文本,而在主要内容区域保持丰富的 HTML 格式。