【问题标题】:FREEMARKER: avoid escaping HTML charsFREEMARKER:避免转义 HTML 字符
【发布时间】:2023-11-20 21:23:01
【问题描述】:

freemarker 输出有问题...

                [#assign optionsHTML = ""]                    
                [#list data as item]
                    [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /]
                [/#list]

所以,如果我这样做了

<select>
${iptionsHTML}
</select>

otions 的输出得到 html 实体而不是实际的 html....所以

&lt;option value=&quot .....

即使我这样做了

            [#assign optionsHTML = ""]                    
            [#list data as item]
                [#noescape]
                [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /]
                [/#noescape]
            [/#list]

试过了

<select>
${iptionsHTML?html}
</select>

但更糟糕的是:(

【问题讨论】:

标签: freemarker html-escape-characters


【解决方案1】:

#noescape 放在#assign 周围没有任何效果。自动转义仅适用于嵌入直接到静态文本(HTML)中的${...}-s。因此,#assign 内部没有转义来禁用。

?html 用于“手动”转义字符串。就像在您的示例中一样,您可以编写 optionsHTML = optionsHTML + '&lt;option value="${item.value?html}&gt;${item.label?html}&lt;/option&gt;',因为您知道该值稍后会以非自动转义的方式输出,并且字符串文字中的 ${...}-s 不会自动转义。

但是,最好的办法是您可以组织您的代码,以便生成 HTML 的东西不会在变量中构造 HTML,然后打印变量,而是将 HTML 直接打印到输出中。这就是 FTL 的设计目的。

【讨论】:

    【解决方案2】:

    所以在尝试了东西之后,我不知道我之前做错了什么,但是干净,这种方式是有效的

    [#assign optionsHTML = ""]                    
    [#list data as item]
       [#assign optionsHTML = optionsHTML + '<option value="' + item.value +'>'+ item.label + '</option>' /]
    [/#list]
    
    
    
    <select>
       [#noescape]
       ${optionsHTML}
       [/#noescape]
    </select>
    

    【讨论】:

      【解决方案3】:

      就像 ddekany 说的,这样写:

      <select>
        [#list data as item]
          <option value="${item.value}">${item.label}</option>
        [/#list]
      </select>
      

      【讨论】:

      • 是的,我做到了,但我必须使用 2 个列表......可能没有提到那部分......我这样做的唯一原因是构建 HTML 字符串 var避免遍历列表两次(一次用于输出选择选项,另一次用于获取标签,这是通过检查所选选项来确定的......我只需要简化这个例子,这样我就可以得到我实际的位的答案需要
      【解决方案4】:

      我在带有特殊字符的字符串中遇到了同样的问题。 在这个例子中,我有 checknumber = "6547&6548" 在使用此#escape 之前导致问题

      按照以下代码处理此问题的最佳和简单方法

      <#escape x as x?html>${deposit.checkNumber}</#escape>
      

      【讨论】:

        最近更新 更多