如何让.rain文件中replace函数匹配精确数值避免替换冲突?
解决Rain模板中直径字符串精确替换问题
问题根源
你当前使用的replace是子字符串匹配逻辑,处理"150 mm"时,不管替换顺序如何,只要字符串里包含"50 mm"就会被触发替换,导致150被拆成"1"+"50 mm",最终输出错误的"thickness 1thickness50 mm"。
可行解决方案
1. 正则表达式精确匹配
RainTPL支持正则替换,用单词边界\b确保只匹配完整的数值短语:
{% elseif s_category.title == 'diameters' %} {{ s2_category.title | replace('/\\b50 mm\\b/', 'thickness 50 mm') | replace('/\\b150 mm\\b/', 'thickness 150 mm') }}
\b会限定匹配独立的"50 mm"或"150 mm",不会命中更长字符串里的子串。
2. 提取数值后重新拼接
如果所有直径都是"X mm"的固定格式,直接提取数值再拼接前缀更稳妥:
{% elseif s_category.title == 'diameters' %} {% set diameter_num = s2_category.title | split(' mm')[0] %} {{ 'thickness ' ~ diameter_num ~ ' mm' }}
这种方式完全绕开字符串匹配冲突,适合所有符合格式的直径值。
3. 自定义过滤器批量处理
如果允许在PHP端自定义RainTPL过滤器,可以写一个通用处理函数,一次搞定所有直径:
// PHP端注册自定义过滤器 RainTPL::registerFilter('add_thickness', function($text) { return preg_replace('/\\b(\\d+) mm\\b/', 'thickness $1 mm', $text); });
模板中直接调用:
{% elseif s_category.title == 'diameters' %} {{ s2_category.title | add_thickness }}
这种扩展性最强,新增直径值时不用修改模板代码。
内容的提问来源于stack exchange,提问作者JuLu
相关产品推荐
相关产品推荐

