删除 Freemarker 模板中的 HTML 标签

pvo*_*orb 1 html java freemarker

我有一个 freemarker 模板,它在允许 HTML 的上下文和不允许 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>
Run Code Online (Sandbox Code Playgroud)

该模型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>
Run Code Online (Sandbox Code Playgroud)

使用内置的esc会给我带来<title>A &lt;strong&gt;Strong&lt;/strong&gt; Argument</title>相反的结果,这不是想要的。

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

Chr*_*ill 6

您可以使用 Freemarker 内置字符串替换函数和“r”标志来启用正则表达式。

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

${page_title?replace('<[^>]+>','','r')}
Run Code Online (Sandbox Code Playgroud)

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

${page_title?replace('\\s+','','r')}
Run Code Online (Sandbox Code Playgroud)