在安企CMS的模板开发中,我们常常会遇到需要处理由富文本编辑器输出的内容。这些内容通常会包含各种HTML标签,比如用于强调的 <strong>,用于斜体的 <i>,或者其他如 <em><span><div> 等。虽然这些标签在编辑时赋予了内容丰富的样式,但在某些特定的展示场景下,我们可能需要移除其中的一部分,以确保页面风格的统一性或达到特定的显示效果。

安企CMS的模板系统,其语法设计与Django模板引擎非常相似,提供了强大的过滤器功能来处理这类需求。当内容包含HTML标签并需要在前端页面正确显示时,我们通常会使用 |safe 过滤器来告诉模板引擎这段内容是安全的,不需要进行HTML实体转义,从而让浏览器将其作为正常的HTML代码渲染。但如果我们的目标是移除某些特定的HTML标签,我们就需要引入另一个功能强大的工具。

理解 removetags 过滤器:精准移除的利器

安企CMS提供了 removetags 过滤器,它能够精确地移除内容中我们指定的所有HTML标签。这对于保持页面布局的整洁和一致性,或者当某些标签(如用户输入的不当标签)可能破坏页面结构时,都显得尤为实用。

removetags 过滤器的基本用法是:

{{ 内容变量 | removetags:"标签名1,标签名2,..." | safe }}

例如,假设我们有一段文章内容存储在 archive.Content 变量中,并且这段内容可能包含 <i><strong> 标签,但我们希望在显示时将它们移除,同时保留其他如 <p><a> 等标签。我们可以这样使用 removetags 过滤器:

<div>
    {{ archive.Content | removetags:"i,strong" | safe }}
</div>

这段代码会遍历 archive.Content 中的所有HTML标签,并将所有 <i><strong> 标签本身移除,但会保留这些标签内部的文本内容。然后,|safe 过滤器确保处理后的内容能够作为HTML代码被浏览器正常渲染。请注意,如果需要移除多个标签,只需将标签名用英文逗号 , 分隔开即可。

你可以移除任何标准的HTML标签,例如:

  • 移除斜体和强调:removetags:"i,em,strong"
  • 移除泛用性容器:removetags:"span,div"
  • 移除图片和链接(如果内容中不希望出现):removetags:"img,a"

通过这种方式,你可以非常灵活地控制哪些HTML标签可以被显示,哪些应该被清理。

striptags 过滤器:全盘清理的另一种选择

除了 removetags,安企CMS还提供了 striptags 过滤器。它与 removetags 的区别在于,striptags 会移除内容中 所有 的HTML标签(包括XML和PHP标签),只保留纯文本内容。

striptags 过滤器的基本用法是:

{{ 内容变量 | striptags | safe }}

例如,如果 archive.Description 字段可能包含HTML,但我们只想要显示纯文本的简介,那么可以使用:

<p>
    {{ archive.Description | striptags | safe }}
</p>

striptags 适用于需要完全去除所有格式化、只获取最原始文本的场景。然而,如果你的目的是有选择性地保留某些HTML标签,而仅仅移除另外一些,那么 removetags 会是更精确、更合适的选择。

实际应用中的一些考虑

在模板中运用这些过滤器时,有一些重要的细节需要注意:

  • 过滤器链的顺序至关重要: 务必确保 removetagsstriptags 过滤器在 |safe 之前应用。如果 |safe 过滤器先被执行,内容中的HTML标签会先被浏览器识别为真正的HTML元素,那么 removetags 就无法再对其进行操作了。正确的顺序是先处理HTML结构,再标记为安全输出。

  • 标签名称的大小写: 尽管HTML标签通常不区分大小写,但为了确保**的兼容性和避免潜在的问题,建议在 removetags 过滤器中统一使用小写的标签名。

  • 安全与内容来源: 移除标签可以帮助你控制页面样式,但它并不能完全替代对用户输入内容的安全审查。如果你的内容来源于不可信的外部渠道,即使移除了特定标签,也应继续警惕潜在的跨站脚本(XSS)攻击风险。在某些情况下,可能需要结合其他安全措施,或对内容源进行更严格的过滤。

通过灵活运用 removetagsstriptags 这两个过滤器,你可以更好地控制安企CMS模板中内容的显示方式,让你的网站在保持内容丰富性的同时,拥有更加统一和专业的视觉呈现。


常见问题 (FAQ)

  1. Q: 移除 <i><strong> 标签后,内容文本的样式(如斜体、加粗)还会保留吗? A: 不会。removetags 过滤器会移除标签本身,这意味着这些标签所附带的样式(例如 <i> 带来的斜体,<strong> 带来的加粗)将不会再显示。但是,标签内的文本内容会完整地保留下来。

  2. Q: 如果我想移除 HTML 标签,但又不想使用 |safe 过滤器,可以吗? A: 可以的。如果你不使用 |safe 过滤器,模板引擎会默认对内容进行HTML实体转义。这意味着所有的HTML标签(包括你想要保留的标签)都将以原始文本的形式显示,而不是作为可渲染的HTML元素。在处理富文本内容时,通常需要 |safe 才能让允许保留的HTML标签正确渲染。

  3. Q: removetags 能移除包含属性的HTML标签吗?比如 <a href="link.html"> A: 是的,removetags 过滤器是基于标签名进行匹配和移除的,无论该标签是否包含属性,只要标签名匹配,整个标签(包括其所有属性)及其内部的文本内容都会被处理。如果你指定移除 a 标签,那么 <a href="link.html">文本</a> 将只剩下 文本