java 限制FreeMarker中的字符串长度

eoxn13cs  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(161)

我试图从FreeMarker中的字符串获取子字符串。但是有两个问题需要考虑:
1.字符串可以为空
1.字符串可以短于最大字符串长度
我做了以下工作:

<#list landingpage1.popularItems as row>
    <li>
        <span class="minititle">
            <#assign minititle=(row.title!"")>
            <#if minititle?length &lt; 27>
                ${minititle}
            <#else>
                ${minititle?substring(0,26)} ...
            <#/if>
        </span>
    </li>
</#list>

我得到一个freemarker错误说:

Failed to load templates: Encountered "</#list>" at line 144, column 65 in landingpage1.ftl.
Was expecting one of:
    <ATTEMPT> ...
    <IF> ...
    <LIST> ...
    <FOREACH> ...
    <SWITCH> ...
    <ASSIGN> ...
    <GLOBALASSIGN> ...
    <LOCALASSIGN> ...
    <INCLUDE> ...
    <IMPORT> ...
    <FUNCTION> ...
    <MACRO> ...
    <TRANSFORM> ...
    <VISIT> ...
    <STOP> ...
    <RETURN> ...
    <CALL> ...
    <SETTING> ...
    <COMPRESS> ...
    <COMMENT> ...
    <TERSE_COMMENT> ...
    <NOPARSE> ...
    <END_IF> ...
    <BREAK> ...
    <SIMPLE_RETURN> ...
    <HALT> ...
    <FLUSH> ...
    <TRIM> ...
    <LTRIM> ...
    <RTRIM> ...
    <NOTRIM> ...
    <SIMPLE_NESTED> ...
    <NESTED> ...
    <SIMPLE_RECURSE> ...
    <RECURSE> ...
    <FALLBACK> ...
    <ESCAPE> ...
    <NOESCAPE> ...
    <UNIFIED_CALL> ...
    <WHITESPACE> ...
    <PRINTABLE_CHARS> ...
    <FALSE_ALERT> ...
    "${" ...
    "#{" ...

很奇怪。有人能帮忙吗?

bvuwiixz

bvuwiixz1#

这个错误在经过大量测试后神奇地自行解决了。一定是因果报应。
我的安全检查的最终代码:

<#assign minititle=(row.title!"")>
<#if minititle?length &lt; 27>
${minititle}
<#else>
${minititle?substring(0,26)} ...
</#if>

希望能帮助到其他人

xmakbtuz

xmakbtuz2#

我相信你很高兴它现在可以工作了,但是你收到的错误与你的字符串截断代码无关,这是因为你的〈/#if〉不正确。

<#if condition >
    This Is Correct
</#if>

<#if condition >
    This Will Show An Error
<#/if>
d5vmydt9

d5vmydt93#

不使用if-else的更简单的解决方案
${小标题?左填充(26)[0.. *26]}
这将-首先在左侧插入白色以确保字符串长度至少为26个字符(如果字符串短于26个字符)-将字符串截断为精确的26个字符(如果字符串长于26个字符)
我试过了,它在2.3.24版本中运行良好

uoifb46i

uoifb46i4#

从Freemarker 2.3.29(2019年8月17日发布)起,有一个新的内置函数,称为truncate。
string?truncate(length)将文本截断为给定长度,如果截断发生,默认情况下在结尾处添加[...]。截断发生在单词边界,除非结果太短,在这种情况下,它福尔斯到单词中间截断。还有?truncate_w强制单词边界截断,以及?truncate_c(用于字符边界)不关心单词边界。
所以现在这个问题可以简单的解决了

${minititle?truncate(26)}

相关问题