如何在Shopify Liquid中检测字符串是否以指定子串结尾?
在Shopify Liquid中判断字符串是否以指定子串结尾的优化方案
我需要在Shopify Liquid里判断一个字符串是否以某个特定子串结尾,以下是我试过的几种方法:
内置方法
Shopify Liquid没有ends_with这类字符串过滤器。
正则表达式
Liquid也不支持正则匹配功能。
从末尾截断后比较
很多语言支持自定义从字符串末尾截断内容,但Liquid只支持截断空格,此方法不可行。
按子串分割后检查结果
我试过用assign tmp = str | split: substr后检查结果,原以为如果最后一项是空字符串就能判断,但比如用X分割..X..和..X..X得到的结果都是["..", ".."],这个思路无效。
删除最后匹配的子串后追加再比较
这个方法可行,但代码不够简洁:
{% liquid assign tmp = str | remove_last: substr | append: substr if tmp == str assign output = true else assign output = false endif %}
截取字符串末尾部分与子串比较
此方法也可行,但因为Liquid不支持括号,代码反而更长:
{% liquid assign tmp_neg_substr_size = 0 | minus: substr.size assign tmp_ending = str | slice: tmp_neg_substr_size, substr.size if tmp_ending == substr assign output = true else assign output = false endif %}
有没有更优的解决方案?或者能不能把现有方案简化成一行代码?
简化方案
针对现有的可行方案,确实可以简化成更紧凑的代码:
基于remove_last的一行简化
直接通过条件判断赋值,无需多行liquid块:
{% assign output = (str | remove_last: substr | append: substr) == str %}
基于slice的简化
可以把临时变量和判断整合,更紧凑:
{% assign neg_len = 0 | minus: substr.size %} {% assign output = (str | slice: neg_len, substr.size) == substr %}
如果追求极致一行(可读性稍弱):
{% assign output = (str | slice: 0 | minus: substr.size, substr.size) == substr %}
边界情况处理:如果需要兼容子串为空的场景(此时通常应返回true),可以补充判断:
{% assign output = substr == "" ? true : (str | remove_last: substr | append: substr) == str %}
内容的提问来源于stack exchange,提问作者tremby
相关产品推荐
相关产品推荐

