12

我正在尝试从 FreeMarker 中的字符串中获取子字符串。但是有 2 点需要考虑:

  1. 字符串可以为空
  2. 字符串可以短于最大字符串长度

我执行以下操作:

<#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> ...
    "${" ...
    "#{" ...

很奇怪。有人可以帮忙吗?

4

3 回答 3

26

经过大量测试后,该错误神奇地自行解决。一定是业力。

我用于安全检查的最终代码:

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

希望它可以帮助别人

于 2010-08-03T09:06:18.953 回答
7

我确定您很高兴它现在可以正常工作,但是您收到的错误与您的字符串截断代码无关,这是因为您的 </#if> 不正确。

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


<#if condition >
    This Will Show An Error
<#/if>
于 2013-01-17T21:51:22.170 回答
2

不使用 if-else 的更简单的解决方案

${minititle?left_pad(26)[0..*26]}

这将 - 首先在左侧插入空格以确保字符串至少为 26 个字符长(如果字符串短于 26 个字符) - 将字符串截断为精确的 26 个字符长(如果字符串长于 26 个字符)

我已经尝试过了,它在 2.3.24 版本中运行良好

于 2016-05-12T17:27:13.000 回答