删除 Freemarker 模板中的 HTML 个标签

Remove HTML tags in Freemarker Template

我有一个 freemarker 模板,它在允许 HTML 的上下文和不允许的上下文中显示相同的字符串。

Freemarker 中是否有内置功能允许我从字符串中完全删除 HTML 标签?

以下模板(假设有一个内置的remove_html

<#ftl output_format="HTML"/>
<html>
  <head>
    <title>${page_title?remove_html}</title>
  </head>
  <body>
    <h1>${page_title?no_esc}</h1>
  </body>
</html>

模型 Collections.singletonMap("page_title", "A <strong>Strong</strong> Argument") 应该导致

<html>
  <head>
    <title>A Strong Argument</title>
  </head>
  <body>
    <h1>A <strong>Strong</strong> Argument</h1>
  </body>
</html>

使用内置 esc 会给我 <title>A &lt;strong&gt;Strong&lt;/strong&gt; Argument</title>,这 不是 我要找的。

是否有类似 remove_html 的东西,或者我需要自己提供吗? (例如,使用 OWASP's java-html-sanitizer。)

您可以使用带有 "r" 标志的 Freemarker built-in 字符串替换函数来启用正则表达式。

这是一个简单的正则表达式,可以解决问题:

${page_title?replace('<[^>]+>','','r')}

请注意,如果您在正则表达式中使用反斜杠,则必须对其进行转义,如下所示(删除空格的人为示例):

${page_title?replace('\s+','','r')}

自 2.3.28 起没有内置任何内容,所以是的,您必须自己创建。