我试图从FreeMarker中的字符串获取子字符串。但是有两个问题需要考虑:
1.字符串可以为空
1.字符串可以短于最大字符串长度
我做了以下工作:
<#list landingpage1.popularItems as row>
<li>
<span class="minititle">
<#assign minititle=(row.title!"")>
<#if minititle?length < 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条答案
按热度按时间bvuwiixz1#
这个错误在经过大量测试后神奇地自行解决了。一定是因果报应。
我的安全检查的最终代码:
希望能帮助到其他人
xmakbtuz2#
我相信你很高兴它现在可以工作了,但是你收到的错误与你的字符串截断代码无关,这是因为你的〈/#if〉不正确。
d5vmydt93#
不使用if-else的更简单的解决方案
${小标题?左填充(26)[0.. *26]}
这将-首先在左侧插入白色以确保字符串长度至少为26个字符(如果字符串短于26个字符)-将字符串截断为精确的26个字符(如果字符串长于26个字符)
我试过了,它在2.3.24版本中运行良好
uoifb46i4#
从Freemarker 2.3.29(2019年8月17日发布)起,有一个新的内置函数,称为truncate。
string?truncate(length)将文本截断为给定长度,如果截断发生,默认情况下在结尾处添加[...]。截断发生在单词边界,除非结果太短,在这种情况下,它福尔斯到单词中间截断。还有?truncate_w强制单词边界截断,以及?truncate_c(用于字符边界)不关心单词边界。
所以现在这个问题可以简单的解决了