Smarty模板中如何判断分类ID前两位为指定字符实现前缀匹配
Smarty模板校验分类ID指定前缀的正确实现
原有代码问题
strstr修饰符的匹配逻辑是查找字符串任意位置是否存在目标子串,只要分类ID中包含"11""15""16"字符段就会命中,才会出现111523这类中间带目标字符的ID被误匹配的问题,不符合「仅匹配以指定字符开头的ID」的需求。
实现方案
优先选择字符串截取对比的方案,逻辑直观无正则兼容问题,同时可以合并重复判断分支,简化代码:
{if !$product.add_to_cart_url || $product->quantity < 2 || (in_array(($product->id_category_default)|string_format:"%s"|substr:0:2, ['11','15','16']) && $product->quantity < 10) }disabled {/if}
代码说明
|string_format:"%s":先将分类ID强制转为字符串格式,避免纯数字类型ID在不同PHP环境下字符串函数处理的兼容问题|substr:0:2:从字符串第0位开始截取2个字符,也就是取ID的前两位in_array(..., ['11','15','16']):判断截取到的前两位是否属于目标前缀列表,后续如果要新增前缀只需要往数组里加值即可,不用重复写判断分支
如果习惯用正则匹配,也可以用前缀正则写法,^在正则中代表字符串起始位置,只会匹配开头的目标字符:
{if !$product.add_to_cart_url || $product->quantity < 2 || (preg_match('/^(11|15|16)/', $product->id_category_default) && $product->quantity < 10) }disabled {/if}
避坑提示
- 不要用
strstr/strpos类全字符串查找函数做前缀匹配,这类函数不限制匹配位置,必然会出现中间字符误判的问题 - 原代码中多个
elseif分支的判断逻辑完全一致(前缀不同但库存阈值都是<10),不需要拆分多个重复分支,合并后可维护性更高
内容的提问来源于stack exchange,提问作者Nesta78
相关产品推荐
相关产品推荐

