Freemarker中如何替换<li>元素并生成递增计数索引
Freemarker 实现标签递增序号替换方案
问题本质
Freemarker 内置的replace为全局静态值替换,传入的替换值固定不变,无法根据匹配位置生成动态递增的计数索引,因此直接用replace方法无法实现需求。
通用实现方案(兼容全版本Freemarker)
通过字符串拆分+手动计数的逻辑完成替换,无版本依赖:
<#-- 初始化列表计数 --> <#assign itemIndex = 0> <#-- 以转义后的<li>开始标签为分隔符拆分原内容 --> <#assign segments = content?split('<li>')> <#-- 跳过拆分产生的开头空片段,逐段处理内容 --> <#list segments[1..] as segment> <#assign itemIndex = itemIndex + 1> ${itemIndex} ${segment?replace('</li>', '')} </#list>
适配调整
- 若
content存储的是未转义的真实HTML标签(即标签为<li>/</li>而非转义实体),只需将代码中的分隔符、待替换闭合标签替换为对应的真实文本即可 - 若存在带属性的li标签(如
<li class="list-item">),需根据实际标签格式调整拆分匹配规则
避坑提示
- 单次全局replace(即使开启正则匹配)无法携带动态计数上下文,不能用来实现递增替换
- 实现后输出效果与预期一致:移除所有li标签,在每段列表内容前拼接1、2、3格式的递增序号
内容的提问来源于stack exchange,提问作者Neeraj Kumar
相关产品推荐
相关产品推荐

