在 AnQiCMS 的模板设计中,我们经常会遇到需要对内容中的 HTML 代码进行清理或精简的情况。这不仅仅是为了美观,更是为了确保内容的正确展示、提高页面加载效率,甚至是为了防范潜在的安全风险。安企CMS为此提供了两个非常实用的过滤器:striptagsremovetags。虽然它们都与 HTML 标签的移除有关,但各自有着明确的适用场景。

striptags 过滤器:彻底清除 HTML 标签,获取纯文本内容

当我们希望从一段包含 HTML 格式的内容中,完全提取出其纯文本部分时,striptags 过滤器就显得尤为重要。它的作用是剥离字符串中所有的 HTML、XML 乃至 PHP 标签,只留下文本内容,并且它还会自动清除 HTML 注释。

适用场景:

  1. 生成页面元描述(Meta Description)或摘要: 搜索引擎通常只抓取纯文本作为网页的元描述或内容摘要。如果内容源带有大量复杂的 HTML 结构,直接截取可能会导致乱码或不必要的标签显示。此时,使用 striptags 可以确保输出的摘要是干净、简洁的纯文本,有利于 SEO 优化和用户体验。例如,在文章列表页展示文章简介时,通常会用到它。
  2. 创建纯文本内容预览: 在某些情况下,比如在弹窗、工具提示或移动设备上的极简视图中,我们可能不需要任何格式,只希望显示内容的骨干信息。striptags 能迅速提供这种纯文本视图。
  3. 内容输出到非 HTML 环境: 如果你需要将网站内容导出为文本文件、用于生成邮件通知的纯文本部分,或者通过 API 接口向外部系统提供纯文本数据,striptags 能够有效去除所有格式,确保数据的兼容性。
  4. 清理用户输入的“脏”内容: 虽然 AnQiCMS 后台有严格的内容过滤机制,但在某些特定场景下,若想对用户输入进行额外的、彻底的纯文本转换,striptags 也能作为一道额外的防线。

示例: 假设 article.Content 变量中包含一段带有 <h2><p><strong> 等标签的 HTML 内容。

<meta name="description" content="{{ article.Content|striptags|truncatechars:150 }}">

<div class="article-summary">{{ article.Content|striptags|truncatewords:50 }}...</div>

通过 striptags 过滤后,无论是输出到 meta 标签还是作为文章摘要,都将是没有任何 HTML 格式的纯文本。

removetags 过滤器:精准删除指定的 HTML 标签,保留所需格式

striptags 的“全部不要”策略不同,removetags 过滤器提供了更精细的控制能力。它允许你指定一个或多个 HTML 标签,然后只从内容中移除这些被指定的标签,而保留其他所有未被提及的 HTML 标签和内容。

适用场景:

  1. 内容安全过滤: 这是 removetags 最常见的应用之一。为了防止跨站脚本攻击(XSS),我们可能需要移除用户提交内容中的 <script><iframe><style> 等具有潜在风险的标签,但同时允许保留 <strong><em><a> 等安全且常用的格式标签。
  2. 统一内容风格: 在网站的不同区域,可能需要内容遵循不同的样式规范。例如,在评论区,你可能只允许用户使用 <strong><a> 标签,而其他如 <img><h1> 等标签则需要被移除,以保持评论区的版式整洁。
  3. 内容适配不同展示区域: 有时,同一段内容需要在不同尺寸或风格的区域展示。例如,一个新闻文章的主体内容可能包含图片和视频,但在侧边栏的“热门文章”列表中,我们可能希望移除所有 <img><video> 标签,只保留文本和链接,以节省空间。
  4. 特定格式调整: 如果网站的样式设计不希望某些特定的 HTML 标签(如过时的 <font> 标签或不规范的 <span>)出现在前端,removetags 可以精准地将它们清理掉,而不影响其他正常的 HTML 结构。

示例: 假设 userComment.Content 变量中包含用户提交的评论,可能包含 <strong><a>,但也有潜在的 <script><img>

<div class="comment-body">
    {{ userComment.Content|removetags:"script,style,iframe,img,video"|safe }}
</div>

这里,我们移除了 <script>, <style>, <iframe>, <img>, <video> 标签,但保留了 <strong><a> 等安全且有用的标签。|safe 过滤器是必要的,因为它告诉模板引擎,经过 removetags 处理后剩余的 HTML 代码是安全的,可以直接作为 HTML 输出,而不需要进行默认的转义。

如何选择:问自己一个问题

在决定使用 striptags 还是 removetags 时,可以问自己一个简单的问题:我希望内容中保留HTML 格式吗?

  • 如果答案是“不,我只想要纯文本,不希望有任何 HTML 标签存在”,那么 striptags 是你的首选。
  • 如果答案是“是的,我希望保留一部分 HTML 格式,但要删除特定的、我不希望出现的标签”,那么 removetags 则是更合适的选择。

理解这两个过滤器的核心差异和适用场景,能帮助我们更高效、安全地管理和展示 AnQiCMS 网站的内容,让模板输出更加符合预期。


常见问题 (FAQ)

Q1: 我想保留内容中的 <a> 链接标签,但移除所有其他 HTML 标签,应该使用哪个过滤器?

A1: 在这种情况下,removetags 过滤器是更合适的选择。你可以明确指定移除除了 <a> 之外的所有常见 HTML 标签,但这可能是一个很长的列表。一个更直接的思路是,如果你明确知道除了 <a> 之外的所有标签都应该被移除,那你可以先使用 striptags 彻底移除所有标签以获得纯文本,然后手动将文本中的 URL 转换为 <a> 标签(如果你的业务逻辑允许这样做,或者使用如 urlize 这样的辅助工具),但这通常更复杂。通常,更实际的做法是使用 removetags 来清除那些明确知道不想要的标签,并确保你想要保留的标签(如 <a>)不在 removetags 的移除列表中。例如:{{ article.Content|removetags:"p,div,h1,h2,img,strong,em,script,style"|safe }}

Q2: striptagsremovetags 这两个过滤器可以一起使用吗?

A2: 可以的,它们可以像管道一样被串联使用。例如,{{ article.Content|striptags|removetags:"p" }}。不过,由于 striptags 已经移除了所有 HTML 标签,再对其进行 removetags 操作通常